commit 15f5cfc0f8da088877a22bf4de74574ccd4ec9e3 Author: nathan Date: Mon May 11 00:26:02 2026 -0700 Initial Agrarian Unreal project diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e33c2f1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,91 @@ +[*.{cpp,h}] + +# Naming convention rules (note: currently need to be ordered from more to less specific) + +cpp_naming_rule.aactor_prefixed.symbols = aactor_class +cpp_naming_rule.aactor_prefixed.style = aactor_style + +cpp_naming_rule.swidget_prefixed.symbols = swidget_class +cpp_naming_rule.swidget_prefixed.style = swidget_style + +cpp_naming_rule.uobject_prefixed.symbols = uobject_class +cpp_naming_rule.uobject_prefixed.style = uobject_style + +cpp_naming_rule.booleans_prefixed.symbols = boolean_vars +cpp_naming_rule.booleans_prefixed.style = boolean_style + +cpp_naming_rule.structs_prefixed.symbols = structs +cpp_naming_rule.structs_prefixed.style = unreal_engine_structs + +cpp_naming_rule.enums_prefixed.symbols = enums +cpp_naming_rule.enums_prefixed.style = unreal_engine_enums + +cpp_naming_rule.templates_prefixed.symbols = templates +cpp_naming_rule.templates_prefixed.style = unreal_engine_templates + +cpp_naming_rule.general_names.symbols = all_symbols +cpp_naming_rule.general_names.style = unreal_engine_default + +# Naming convention symbols + +cpp_naming_symbols.aactor_class.applicable_kinds = class +cpp_naming_symbols.aactor_class.applicable_type = AActor + +cpp_naming_symbols.swidget_class.applicable_kinds = class +cpp_naming_symbols.swidget_class.applicable_type = SWidget + +cpp_naming_symbols.uobject_class.applicable_kinds = class +cpp_naming_symbols.uobject_class.applicable_type = UObject + +cpp_naming_symbols.boolean_vars.applicable_kinds = local,parameter,field +cpp_naming_symbols.boolean_vars.applicable_type = bool + +cpp_naming_symbols.enums.applicable_kinds = enum + +cpp_naming_symbols.templates.applicable_kinds = template_class + +cpp_naming_symbols.structs.applicable_kinds = struct + +cpp_naming_symbols.all_symbols.applicable_kinds = * + +# Naming convention styles + +cpp_naming_style.unreal_engine_default.capitalization = pascal_case +cpp_naming_style.unreal_engine_default.required_prefix = +cpp_naming_style.unreal_engine_default.required_suffix = +cpp_naming_style.unreal_engine_default.word_separator = + +cpp_naming_style.unreal_engine_enums.capitalization = pascal_case +cpp_naming_style.unreal_engine_enums.required_prefix = E +cpp_naming_style.unreal_engine_enums.required_suffix = +cpp_naming_style.unreal_engine_enums.word_separator = + +cpp_naming_style.unreal_engine_templates.capitalization = pascal_case +cpp_naming_style.unreal_engine_templates.required_prefix = T +cpp_naming_style.unreal_engine_templates.required_suffix = +cpp_naming_style.unreal_engine_templates.word_separator = + +cpp_naming_style.unreal_engine_structs.capitalization = pascal_case +cpp_naming_style.unreal_engine_structs.required_prefix = F +cpp_naming_style.unreal_engine_structs.required_suffix = +cpp_naming_style.unreal_engine_structs.word_separator = + +cpp_naming_style.uobject_style.capitalization = pascal_case +cpp_naming_style.uobject_style.required_prefix = U +cpp_naming_style.uobject_style.required_suffix = +cpp_naming_style.uobject_style.word_separator = + +cpp_naming_style.aactor_style.capitalization = pascal_case +cpp_naming_style.aactor_style.required_prefix = A +cpp_naming_style.aactor_style.required_suffix = +cpp_naming_style.aactor_style.word_separator = + +cpp_naming_style.swidget_style.capitalization = pascal_case +cpp_naming_style.swidget_style.required_prefix = S +cpp_naming_style.swidget_style.required_suffix = +cpp_naming_style.swidget_style.word_separator = + +cpp_naming_style.boolean_style.capitalization = pascal_case +cpp_naming_style.boolean_style.required_prefix = b +cpp_naming_style.boolean_style.required_suffix = +cpp_naming_style.boolean_style.word_separator = \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b39d47d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Unreal binary assets should use Git LFS when this project is put in Git. +*.uasset filter=lfs diff=lfs merge=lfs -text +*.umap filter=lfs diff=lfs merge=lfs -text +*.ubulk filter=lfs diff=lfs merge=lfs -text +*.uexp filter=lfs diff=lfs merge=lfs -text +*.wav filter=lfs diff=lfs merge=lfs -text +*.mp3 filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.tga filter=lfs diff=lfs merge=lfs -text +*.fbx filter=lfs diff=lfs merge=lfs -text +*.blend filter=lfs diff=lfs merge=lfs -text +*.psd filter=lfs diff=lfs merge=lfs -text + +# Text files +*.cpp text eol=lf +*.h text eol=lf +*.cs text eol=lf +*.ini text eol=lf +*.uproject text eol=lf +*.md text eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c11ec1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Unreal generated folders +Binaries/ +DerivedDataCache/ +Intermediate/ +Saved/ +.vs/ +.vscode/ + +# Build outputs +Build/ +*.sln +*.sln.DotSettings.user +*.VC.db +*.opensdf +*.sdf +*.suo +*.user +*.userosscache +*.sln.docstates + +# Logs and local artifacts +*.log +*.tmp +*.cache + +# OS files +.DS_Store +Thumbs.db +Desktop.ini + +# Keep source, config, content, docs, and project files tracked. diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..55fa82e --- /dev/null +++ b/.vsconfig @@ -0,0 +1,19 @@ +{ + "version": "1.0", + "components": [ + "Component.Unreal.Debugger", + "Component.Unreal.Ide", + "Microsoft.Net.Component.4.6.2.TargetingPack", + "Microsoft.VisualStudio.Component.VC.14.38.17.8.ATL", + "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64", + "Microsoft.VisualStudio.Component.VC.14.44.17.14.ATL", + "Microsoft.VisualStudio.Component.VC.14.44.17.14.x86.x64", + "Microsoft.VisualStudio.Component.VC.Llvm.Clang", + "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", + "Microsoft.VisualStudio.Component.Windows11SDK.22621", + "Microsoft.VisualStudio.Workload.CoreEditor", + "Microsoft.VisualStudio.Workload.ManagedDesktop", + "Microsoft.VisualStudio.Workload.NativeDesktop", + "Microsoft.VisualStudio.Workload.NativeGame" + ] +} diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md new file mode 100644 index 0000000..4aacb81 --- /dev/null +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -0,0 +1,1100 @@ +# Agrarian Development Roadmap + +This roadmap converts the Agrarian master vision into a practical, trackable development plan. It is intentionally broad and granular so the project can grow from a small playable Unreal prototype into a long-term persistent civilization platform without losing the original direction. + +## Project North Star + +Agrarian is a persistent generational civilization simulator where players rebuild humanity through survival, stewardship, family, labor, trade, governance, and technological progress. + +The guiding question is: + +> What survives after you are gone? + +Core commitments: + +- [ ] Civilization is built, not spawned. +- [ ] Legacy matters more than levels. +- [ ] History is never erased. +- [ ] The frontier always exists somewhere. +- [ ] Knowledge is the true progression system. +- [ ] AGR has both in-game and real-world community value. +- [ ] No pay-to-win mechanics. +- [ ] No seasonal wipes. +- [ ] No loot boxes. +- [ ] No fragmented DLC model. +- [ ] Build the smallest strong survival foundation first. +- [ ] Keep every system compatible with long-term persistence and generations. + +## Current Known Project Location + +NAS project path: + +```text +//linastorage.local/shared_drive/Unreal Game Projects/agrarian_game/AgrarianGame +``` + +Important project root files/folders: + +- [ ] `AgrarianGame.uproject` +- [ ] `AgrarianGame.sln` +- [ ] `Source/` +- [ ] `Content/` +- [ ] `Config/` +- [ ] `Saved/` +- [ ] `Intermediate/` +- [ ] `Binaries/` +- [ ] `DerivedDataCache/` + +## Roadmap Status Legend + +Use these markers as the project progresses: + +- `[ ]` Not started +- `[~]` In progress +- `[x]` Complete +- `[!]` Blocked or needs decision +- `[?]` Needs design decision + +--- + +# Phase 0 - Project Foundation And Guardrails + +Goal: Prepare the project so all future development is controlled, recoverable, documented, and aligned with the long-term vision. + +## 0.1 Repository And Source Control + +- [ ] Decide where the Unreal project repository will live. +- [ ] Create or confirm GitHub repository for the Unreal project. +- [ ] Decide whether large assets use Git LFS. +- [ ] Add Git LFS for `.uasset`, `.umap`, large media, and binary assets if using Git. +- [ ] Create `.gitignore` for Unreal Engine. +- [ ] Ensure `Binaries/`, `Intermediate/`, `Saved/`, and `DerivedDataCache/` are excluded unless intentionally needed. +- [ ] Commit clean baseline project. +- [ ] Create protected `main` branch. +- [ ] Create `dev` branch if we want staging before main. +- [ ] Define branch naming conventions. +- [ ] Define commit message conventions. +- [ ] Define backup expectations for NAS and repo. +- [ ] Confirm this roadmap file is committed or otherwise backed up. + +## 0.2 Engine And Tooling Decisions + +- [ ] Confirm Unreal Engine version. +- [ ] Decide Blueprint-first, C++-first, or hybrid approach. +- [ ] Decide whether Gameplay Ability System is needed now or later. +- [ ] Decide networking model for MVP. +- [ ] Decide dedicated server target platform. +- [ ] Decide local development platforms. +- [ ] Decide build machine strategy. +- [ ] Create repeatable local build instructions. +- [ ] Create repeatable packaged build instructions. +- [ ] Create repeatable dedicated server build instructions. +- [ ] Document required plugins. +- [ ] Disable unneeded plugins. +- [ ] Confirm project compiles from a clean checkout. +- [ ] Confirm project opens from a clean checkout. + +## 0.3 Design Documentation + +- [ ] Create game design document. +- [ ] Create technical design document. +- [ ] Create multiplayer/networking design document. +- [ ] Create persistence design document. +- [ ] Create economy and AGR design document. +- [ ] Create art direction document. +- [ ] Create UX/HUD direction document. +- [ ] Create content naming conventions. +- [ ] Create folder conventions for Unreal assets. +- [ ] Create coding standards. +- [ ] Create Blueprint standards if using Blueprints. +- [ ] Create data asset standards. +- [ ] Create save/persistence standards. + +## 0.4 Project Structure + +- [ ] Organize `Content/Agrarian/` root folder. +- [ ] Create folders for Characters. +- [ ] Create folders for Environment. +- [ ] Create folders for Items. +- [ ] Create folders for UI. +- [ ] Create folders for Systems. +- [ ] Create folders for Maps. +- [ ] Create folders for Materials. +- [ ] Create folders for Audio. +- [ ] Create folders for DataAssets. +- [ ] Create folders for Prototypes. +- [ ] Create folders for Developer-only test assets. +- [ ] Create naming convention for assets. +- [ ] Move any starter content into clear prototype folders. + +## 0.5 MVP Definition + +- [ ] Define what qualifies as the 6-month MVP. +- [ ] Define what will not be included in MVP. +- [ ] Define target player count for MVP test. +- [ ] Define target map size for MVP. +- [ ] Define MVP biome. +- [ ] Define MVP day/night length. +- [ ] Define survival pressure target. +- [ ] Define basic success loop. +- [ ] Define failure conditions. +- [ ] Define first playable internal milestone. +- [ ] Define closed test readiness criteria. + +--- + +# Phase 1 - Foundational Survival MVP + +Goal: Build a small playable multiplayer prototype that proves survival, weather, inventory, gathering, crafting, shelter, and basic persistence can work together. + +Target deliverable: A small group can join a server, spawn into one biome, gather resources, survive weather, craft primitive tools, build simple shelter, manage hunger/thirst/injury, and return later to find basic world state preserved. + +## 1.1 Core Player Foundation + +- [ ] Create base player character class. +- [ ] Create player controller. +- [ ] Create camera setup. +- [ ] Decide first-person, third-person, or hybrid camera. +- [ ] Implement movement. +- [ ] Implement sprinting. +- [ ] Implement crouching if needed. +- [ ] Implement jumping if needed. +- [ ] Implement interaction trace. +- [ ] Implement interact prompt. +- [ ] Implement basic animation blueprint. +- [ ] Implement placeholder character mesh. +- [ ] Add replication for player movement and core state. +- [ ] Add developer debug overlay for player status. + +## 1.2 Character Stats + +- [ ] Create stat component. +- [ ] Add health. +- [ ] Add stamina. +- [ ] Add hunger. +- [ ] Add thirst. +- [ ] Add body temperature. +- [ ] Add exhaustion. +- [ ] Add injury state. +- [ ] Add infection or sickness placeholder. +- [ ] Add stat regeneration rules. +- [ ] Add stat decay rules. +- [ ] Add stat replication. +- [ ] Add stat save/load support. +- [ ] Add debug commands for modifying stats. +- [ ] Add HUD display for critical stats. + +## 1.3 Time, Weather, And Environment Pressure + +- [ ] Create world time system. +- [ ] Add day/night cycle. +- [ ] Add configurable time scale. +- [ ] Add temperature curve by time of day. +- [ ] Add simple weather states. +- [ ] Add clear weather. +- [ ] Add rain. +- [ ] Add cold/wind state. +- [ ] Add storm placeholder. +- [ ] Add weather transition rules. +- [ ] Add weather replication. +- [ ] Add weather save/load support. +- [ ] Connect weather to body temperature. +- [ ] Connect shelter to weather protection. +- [ ] Add first-pass sky and lighting. +- [ ] Add audio cues for weather. + +## 1.4 Single Biome MVP Map + +- [ ] Choose MVP biome. +- [ ] Create playable test map. +- [ ] Add terrain base. +- [ ] Add foliage pass. +- [ ] Add resource nodes. +- [ ] Add water source. +- [ ] Add weather exposure zones if needed. +- [ ] Add landmark or ruin placeholder. +- [ ] Add spawn area. +- [ ] Add performance profiling markers. +- [ ] Add navigation support for wildlife. +- [ ] Add map boundaries or soft limits. +- [ ] Add developer travel command. + +## 1.5 Inventory System + +- [ ] Design inventory data model. +- [ ] Create item definition data asset. +- [ ] Create item stack structure. +- [ ] Create inventory component. +- [ ] Add item pickup. +- [ ] Add item drop. +- [ ] Add stack splitting. +- [ ] Add item use. +- [ ] Add equipment slots if needed. +- [ ] Add weight or carry capacity placeholder. +- [ ] Add inventory UI. +- [ ] Add replication for inventory changes. +- [ ] Add persistence for inventory. +- [ ] Add debug item spawn command. + +## 1.6 Gathering And Resources + +- [ ] Create resource node base class. +- [ ] Add wood resource. +- [ ] Add stone resource. +- [ ] Add fiber resource. +- [ ] Add edible plant resource. +- [ ] Add water gathering interaction. +- [ ] Add resource depletion. +- [ ] Add respawn rules for MVP. +- [ ] Add tool requirement rules. +- [ ] Add bare-hand gathering fallback. +- [ ] Add resource node persistence. +- [ ] Add replicated gathering feedback. + +## 1.7 Primitive Crafting + +- [ ] Design recipe data model. +- [ ] Create recipe data assets. +- [ ] Implement recipe validation. +- [ ] Implement crafting queue or instant crafting. +- [ ] Add primitive tool recipe. +- [ ] Add campfire recipe. +- [ ] Add shelter recipe. +- [ ] Add simple container recipe. +- [ ] Add bandage or basic treatment recipe. +- [ ] Add crafting UI. +- [ ] Add multiplayer authority checks. +- [ ] Add crafting debug tools. + +## 1.8 Fire System + +- [ ] Create fire actor. +- [ ] Add fuel amount. +- [ ] Add ignition interaction. +- [ ] Add extinguish logic. +- [ ] Add warmth radius. +- [ ] Add light source. +- [ ] Add cooking placeholder if needed. +- [ ] Add smoke/visual effect placeholder. +- [ ] Add replication. +- [ ] Add persistence. +- [ ] Connect fire to body temperature. +- [ ] Connect rain/weather to fire behavior. + +## 1.9 Shelter Building + +- [ ] Decide MVP building style. +- [ ] Create build placement mode. +- [ ] Add ghost preview. +- [ ] Add placement validation. +- [ ] Add basic shelter piece. +- [ ] Add wall piece if needed. +- [ ] Add roof piece if needed. +- [ ] Add door/opening if needed. +- [ ] Add resource cost validation. +- [ ] Add construction interaction. +- [ ] Add shelter protection volume. +- [ ] Add shelter persistence. +- [ ] Add shelter replication. +- [ ] Add deconstruction or damage placeholder. + +## 1.10 Injury And Basic Survival Consequences + +- [ ] Add generic injury state. +- [ ] Add bleeding placeholder. +- [ ] Add sprain or movement penalty placeholder. +- [ ] Add cold exposure damage. +- [ ] Add starvation damage. +- [ ] Add dehydration damage. +- [ ] Add treatment item. +- [ ] Add death state. +- [ ] Add respawn rules for MVP. +- [ ] Add corpse/backpack placeholder if needed. +- [ ] Add replicated death feedback. + +## 1.11 Wildlife Prototype + +- [ ] Choose MVP wildlife species. +- [ ] Create wildlife base pawn. +- [ ] Add simple AI wander. +- [ ] Add flee behavior. +- [ ] Add aggression behavior if needed. +- [ ] Add health. +- [ ] Add damage. +- [ ] Add harvesting interaction. +- [ ] Add meat/hide/bone resources if needed. +- [ ] Add spawn manager. +- [ ] Add replication. +- [ ] Add performance limits. + +## 1.12 Basic Multiplayer + +- [ ] Confirm listen server vs dedicated server for MVP. +- [ ] Create dedicated server build target if needed. +- [ ] Add server travel flow. +- [ ] Add player join flow. +- [ ] Add player spawn flow. +- [ ] Add replicated player stats. +- [ ] Add replicated inventory. +- [ ] Add replicated world time. +- [ ] Add replicated weather. +- [ ] Add replicated resource nodes. +- [ ] Add replicated build pieces. +- [ ] Add network relevancy rules. +- [ ] Add basic latency testing. +- [ ] Add disconnect/reconnect handling. + +## 1.13 Persistence MVP + +- [ ] Decide MVP persistence scope. +- [ ] Save player identity. +- [ ] Save player stats. +- [ ] Save player inventory. +- [ ] Save placed structures. +- [ ] Save resource depletion state if needed. +- [ ] Save world time. +- [ ] Save weather seed/state. +- [ ] Save containers. +- [ ] Add server-side save interval. +- [ ] Add manual admin save command. +- [ ] Add load-on-server-start. +- [ ] Add backup-before-save option. +- [ ] Add recovery plan for corrupted save. +- [ ] Document persistence limitations. + +## 1.14 MVP UI And UX + +- [ ] Add main menu placeholder. +- [ ] Add join server screen. +- [ ] Add loading screen. +- [ ] Add HUD. +- [ ] Add inventory UI. +- [ ] Add crafting UI. +- [ ] Add interaction prompts. +- [ ] Add death/respawn UI. +- [ ] Add debug/dev menu. +- [ ] Add accessibility basics. +- [ ] Ensure UI scales on common resolutions. + +## 1.15 MVP Audio And Atmosphere + +- [ ] Add ambient biome audio. +- [ ] Add footstep placeholders. +- [ ] Add gathering sounds. +- [ ] Add fire sounds. +- [ ] Add weather sounds. +- [ ] Add wildlife sounds. +- [ ] Add UI sounds. +- [ ] Add mix settings. +- [ ] Add volume sliders. + +## 1.16 MVP QA Gates + +- [ ] Can launch packaged client. +- [ ] Can launch server. +- [ ] Can connect two clients. +- [ ] Can gather resources. +- [ ] Can craft a fire. +- [ ] Can craft a shelter. +- [ ] Can survive one full day/night cycle. +- [ ] Can die from survival pressure. +- [ ] Can reconnect and retain state. +- [ ] Can restart server and retain placed shelter. +- [ ] No critical log spam during 30-minute test. +- [ ] Server remains stable with target test player count. + +--- + +# Phase 2 - Persistent Homesteading + +Goal: Transition from temporary survival into lasting settlement and land stewardship. + +## 2.1 Land And Claiming + +- [ ] Design land claim philosophy. +- [ ] Define claim size limits. +- [ ] Define claim cost or effort. +- [ ] Implement claim marker. +- [ ] Implement claim ownership. +- [ ] Implement claim permissions. +- [ ] Add claim UI. +- [ ] Add claim persistence. +- [ ] Add claim conflict rules. +- [ ] Add abandoned claim decay rules. + +## 2.2 Farming + +- [ ] Design soil model. +- [ ] Add basic soil quality. +- [ ] Add moisture. +- [ ] Add crop data assets. +- [ ] Add planting interaction. +- [ ] Add growth stages. +- [ ] Add watering or rainfall impact. +- [ ] Add harvest interaction. +- [ ] Add crop yield rules. +- [ ] Add crop failure rules. +- [ ] Add seed recovery. +- [ ] Add crop persistence. + +## 2.3 Domestication + +- [ ] Choose first domestic animal. +- [ ] Add taming concept. +- [ ] Add feeding. +- [ ] Add containment. +- [ ] Add animal health. +- [ ] Add breeding placeholder. +- [ ] Add animal products. +- [ ] Add ownership. +- [ ] Add persistence. + +## 2.4 Storage And Preservation + +- [ ] Add storage containers. +- [ ] Add container permissions. +- [ ] Add spoilage timer. +- [ ] Add preserved food item. +- [ ] Add drying/smoking/salting placeholder. +- [ ] Add storage persistence. +- [ ] Add storage UI. + +## 2.5 Permanent Structures + +- [ ] Expand building pieces. +- [ ] Add foundation. +- [ ] Add walls. +- [ ] Add roof. +- [ ] Add door. +- [ ] Add basic furniture. +- [ ] Add structure health. +- [ ] Add repair. +- [ ] Add decay rules. +- [ ] Add permissions. +- [ ] Add persistence optimizations. + +## 2.6 Simple Economy + +- [ ] Add barter container. +- [ ] Add simple trade UI. +- [ ] Add ownership transfer. +- [ ] Add local price notes if needed. +- [ ] Add AGR placeholder integration planning. +- [ ] Add transaction logging. + +--- + +# Phase 3 - Social Civilization Systems + +Goal: Let player communities form organically through trade, trust, conflict, law, and local coordination. + +## 3.1 Identity And Reputation + +- [ ] Add player display identity. +- [ ] Add household/family name placeholder. +- [ ] Add reputation records. +- [ ] Add local reputation display. +- [ ] Add reputation event logging. +- [ ] Add positive reputation events. +- [ ] Add negative reputation events. +- [ ] Add reputation decay or locality rules. + +## 3.2 Trade And Contracts + +- [ ] Design direct trade flow. +- [ ] Add secure trade window. +- [ ] Add barter offer records. +- [ ] Add basic contract data model. +- [ ] Add delivery contract. +- [ ] Add labor contract. +- [ ] Add rental contract placeholder. +- [ ] Add contract completion rules. +- [ ] Add dispute placeholder. + +## 3.3 Crime And Consequences + +- [ ] Define theft rules. +- [ ] Define trespassing rules. +- [ ] Define property damage rules. +- [ ] Add crime event logs. +- [ ] Add witness/local knowledge concept. +- [ ] Add basic lock system. +- [ ] Add punishment placeholder. +- [ ] Add moderation/admin review tools. + +## 3.4 Local Governance + +- [ ] Add group/settlement entity. +- [ ] Add membership. +- [ ] Add roles. +- [ ] Add permissions. +- [ ] Add voting placeholder. +- [ ] Add tax placeholder. +- [ ] Add shared storage. +- [ ] Add settlement notice board. + +## 3.5 Migration And Frontier + +- [ ] Design migration pressure model. +- [ ] Add spawn region variation. +- [ ] Add new frontier spawn logic. +- [ ] Add abandoned settlement discovery. +- [ ] Add map hints for settlement density. +- [ ] Add travel risk/reward systems. + +--- + +# Phase 4 - Generational Gameplay + +Goal: Introduce mortality, inheritance, lineage, family knowledge, and the emotional heart of Agrarian. + +## 4.1 Aging And Lifespan + +- [ ] Define time scale for aging. +- [ ] Add character age. +- [ ] Add age categories. +- [ ] Add stat changes by age. +- [ ] Add skill efficiency changes by age. +- [ ] Add mortality rules. +- [ ] Add death by old age. +- [ ] Add UI for age and legacy. + +## 4.2 Family And Relationships + +- [ ] Add relationship model. +- [ ] Add household model. +- [ ] Add spouse/partner placeholder. +- [ ] Add children system design. +- [ ] Add NPC vs player descendant decision. +- [ ] Add family tree UI. +- [ ] Add family persistence. + +## 4.3 Knowledge Inheritance + +- [ ] Define knowledge categories. +- [ ] Add knowledge acquisition. +- [ ] Add teaching interaction. +- [ ] Add apprenticeship. +- [ ] Add inherited knowledge rules. +- [ ] Add knowledge loss if lineage collapses. +- [ ] Add written records or books. +- [ ] Add library/archives concept. + +## 4.4 Inheritance + +- [ ] Add estate model. +- [ ] Add property inheritance rules. +- [ ] Add item inheritance rules. +- [ ] Add claim inheritance. +- [ ] Add settlement role inheritance. +- [ ] Add will/testament placeholder. +- [ ] Add no-heir fallback rules. + +--- + +# Phase 5 - Governments And Civilization + +Goal: Enable cities, citizenship, taxation, diplomacy, organized law, warfare, and territorial control. + +## 5.1 Settlements To Cities + +- [ ] Add settlement progression metrics. +- [ ] Add population tracking. +- [ ] Add infrastructure tracking. +- [ ] Add settlement services. +- [ ] Add city designation. +- [ ] Add city management UI. + +## 5.2 Citizenship And Law + +- [ ] Add citizenship model. +- [ ] Add legal code records. +- [ ] Add local laws. +- [ ] Add permissions by law. +- [ ] Add court/dispute placeholder. +- [ ] Add fines or penalties. + +## 5.3 Taxation And Public Works + +- [ ] Add treasury model. +- [ ] Add tax rules. +- [ ] Add public storage. +- [ ] Add road funding. +- [ ] Add public building funding. +- [ ] Add treasury audit logs. + +## 5.4 Diplomacy + +- [ ] Add settlement relations. +- [ ] Add alliances. +- [ ] Add trade agreements. +- [ ] Add non-aggression pacts. +- [ ] Add war declaration. +- [ ] Add treaty records. + +## 5.5 Warfare + +- [ ] Define combat scale. +- [ ] Add weapon progression. +- [ ] Add armor progression. +- [ ] Add siege placeholder. +- [ ] Add territory conflict rules. +- [ ] Add war consequences. +- [ ] Add anti-griefing protections. + +--- + +# Phase 6 - Dynamic Civilization Cycles + +Goal: Keep the world alive for future generations through change, decay, scarcity, collapse, and renewal. + +## 6.1 Environmental Sustainability + +- [ ] Add soil exhaustion. +- [ ] Add crop rotation benefits. +- [ ] Add deforestation tracking. +- [ ] Add wildlife population tracking. +- [ ] Add water stress. +- [ ] Add resource depletion. +- [ ] Add environmental recovery. + +## 6.2 Disease And Hardship + +- [ ] Add disease model. +- [ ] Add spread rules. +- [ ] Add sanitation concept. +- [ ] Add medicine progression. +- [ ] Add famine conditions. +- [ ] Add disaster events. + +## 6.3 Infrastructure Decay + +- [ ] Add road decay. +- [ ] Add building decay. +- [ ] Add bridge decay. +- [ ] Add maintenance actions. +- [ ] Add ruin state. +- [ ] Add rediscovery value for ruins. + +## 6.4 Collapse And Frontier Renewal + +- [ ] Add settlement instability metrics. +- [ ] Add migration waves. +- [ ] Add abandoned settlement transformation. +- [ ] Add frontier emergence rules. +- [ ] Add new player frontier assignment. + +--- + +# Phase 7 - Earth-Scale Expansion + +Goal: Expand from a small test world toward a large, regionally diverse, persistent world. + +## 7.1 Terrain And World Partition + +- [ ] Evaluate Unreal World Partition. +- [ ] Define terrain generation pipeline. +- [ ] Define hand-authored vs procedural balance. +- [ ] Add streaming tests. +- [ ] Add biome boundaries. +- [ ] Add region metadata. +- [ ] Add server scaling plan. + +## 7.2 Biome Diversity + +- [ ] Add forest biome. +- [ ] Add plains biome. +- [ ] Add mountain biome. +- [ ] Add wetland biome. +- [ ] Add desert/dryland biome. +- [ ] Add cold biome. +- [ ] Add biome-specific resources. +- [ ] Add biome-specific survival pressure. + +## 7.3 Logistics And Transportation + +- [ ] Add roads. +- [ ] Add carts. +- [ ] Add pack animals. +- [ ] Add boats. +- [ ] Add shipping routes. +- [ ] Add regional trade value. +- [ ] Add distance-based economy pressure. + +## 7.4 Continental Economy + +- [ ] Add regional scarcity. +- [ ] Add market hubs. +- [ ] Add transport contracts. +- [ ] Add tariffs or taxes. +- [ ] Add price history. +- [ ] Add economic dashboards. + +--- + +# Phase 8 - Industrial And Automation Era + +Goal: Let player civilizations advance into mechanization, energy, automation, and large-scale production. + +## 8.1 Industrial Materials + +- [ ] Add mining progression. +- [ ] Add ore processing. +- [ ] Add metallurgy. +- [ ] Add machine parts. +- [ ] Add fuel types. +- [ ] Add industrial storage. + +## 8.2 Power Systems + +- [ ] Add mechanical power. +- [ ] Add water power. +- [ ] Add steam power. +- [ ] Add electrical power. +- [ ] Add power grid rules. +- [ ] Add maintenance/failure. + +## 8.3 Production Chains + +- [ ] Add workshops. +- [ ] Add factories. +- [ ] Add production queues. +- [ ] Add labor requirements. +- [ ] Add logistics bottlenecks. +- [ ] Add quality tiers. + +## 8.4 Automation And Robotics + +- [ ] Add automation control concept. +- [ ] Add basic machine workers. +- [ ] Add robotics progression. +- [ ] Add AI-assisted labor. +- [ ] Add safety/failure risks. + +--- + +# Phase 9 - Orbital Foundations + +Goal: Make space feel earned by centuries of civilization, science, industry, and infrastructure. + +## 9.1 Astronomy And Knowledge + +- [ ] Add astronomy observations. +- [ ] Add observatory building. +- [ ] Add star charts. +- [ ] Add orbital mechanics knowledge. +- [ ] Add education requirements. + +## 9.2 Launch Infrastructure + +- [ ] Add advanced materials. +- [ ] Add fuel production. +- [ ] Add launch site construction. +- [ ] Add rocket components. +- [ ] Add launch preparation. +- [ ] Add launch failure risk. + +## 9.3 Orbital Gameplay + +- [ ] Add orbital object model. +- [ ] Add satellites. +- [ ] Add communications benefits. +- [ ] Add navigation benefits. +- [ ] Add orbital maintenance. + +--- + +# Phase 10 - Interplanetary Frontier + +Goal: Expand civilization beyond Earth while keeping Earth emotionally and mechanically central. + +## 10.1 Interplanetary Travel + +- [ ] Add spacecraft design. +- [ ] Add fuel logistics. +- [ ] Add life support. +- [ ] Add navigation. +- [ ] Add travel windows. +- [ ] Add travel risk. + +## 10.2 Colony Logistics + +- [ ] Add colony founding. +- [ ] Add supply chains. +- [ ] Add habitat construction. +- [ ] Add resource extraction. +- [ ] Add communication delay if desired. +- [ ] Add political connection to Earth. + +## 10.3 Multi-World Persistence + +- [ ] Add planetary world records. +- [ ] Add orbital economy. +- [ ] Add interplanetary trade. +- [ ] Add settlement history across worlds. +- [ ] Add long-term expansion governance. + +--- + +# Cross-Cutting Technical Tracks + +These tracks run across all phases and must not be left as afterthoughts. + +## A. Networking + +- [ ] Define server authority rules. +- [ ] Define replication ownership rules. +- [ ] Define relevancy strategy. +- [ ] Define bandwidth budget. +- [ ] Create multiplayer test maps. +- [ ] Add network profiling routine. +- [ ] Add replication tests for each gameplay system. +- [ ] Add disconnect/reconnect tests. +- [ ] Add high latency tests. +- [ ] Add server crash recovery tests. + +## B. Persistence And Database + +- [ ] Define what lives in Unreal save files. +- [ ] Define what lives in external database. +- [ ] Define player account model. +- [ ] Define world state model. +- [ ] Define backup policy. +- [ ] Define rollback policy. +- [ ] Define migration policy. +- [ ] Add automated save validation. +- [ ] Add schema/version tracking. +- [ ] Add admin restore workflow. + +## C. Accounts And Authentication + +- [ ] Decide account provider. +- [ ] Decide Steam account integration timing. +- [ ] Add local dev auth placeholder. +- [ ] Add account identity model. +- [ ] Add character ownership model. +- [ ] Add ban/moderation hooks. +- [ ] Add privacy policy requirements. + +## D. AGR Integration + +- [ ] Define what AGR does in MVP. +- [ ] Define what AGR does not do in MVP. +- [ ] Decide custodial vs non-custodial game wallet approach. +- [ ] Define testnet/devnet flow. +- [ ] Define transaction confirmation rules. +- [ ] Define in-game ledger rules. +- [ ] Define anti-fraud rules. +- [ ] Define market transaction logs. +- [ ] Define bridge between web wallet and game account. +- [ ] Define legal/compliance review points. + +## E. Admin And Moderation + +- [ ] Add admin login/auth. +- [ ] Add server console commands. +- [ ] Add teleport command. +- [ ] Add item grant command. +- [ ] Add player kick/ban command. +- [ ] Add world save command. +- [ ] Add world rollback command. +- [ ] Add player report system. +- [ ] Add audit logs. +- [ ] Add moderation dashboard plan. + +## F. Security And Abuse Prevention + +- [ ] Define trust boundaries. +- [ ] Keep server authoritative. +- [ ] Validate all client requests. +- [ ] Add rate limits where needed. +- [ ] Add anti-cheat research track. +- [ ] Add exploit report workflow. +- [ ] Add log retention policy. +- [ ] Add account recovery policy. +- [ ] Add economy abuse monitoring. + +## G. Performance + +- [ ] Define minimum target hardware. +- [ ] Define client FPS targets. +- [ ] Define server tick targets. +- [ ] Define memory budgets. +- [ ] Define actor count budgets. +- [ ] Add profiling checklist. +- [ ] Add asset size budgets. +- [ ] Add LOD strategy. +- [ ] Add foliage performance strategy. +- [ ] Add save/load performance benchmarks. + +## H. Art Direction + +- [ ] Define visual tone. +- [ ] Define early survival era look. +- [ ] Define old-world ruin look. +- [ ] Define agrarian settlement look. +- [ ] Define UI visual language. +- [ ] Define color palette. +- [ ] Define material style. +- [ ] Define lighting style. +- [ ] Define character style. +- [ ] Define icon style. + +## I. Audio Direction + +- [ ] Define ambient audio style. +- [ ] Define weather audio style. +- [ ] Define wildlife audio style. +- [ ] Define UI sound style. +- [ ] Define music philosophy. +- [ ] Define silence/space usage. +- [ ] Define settlement soundscape. +- [ ] Define industrial era sound progression. + +## J. QA And Testing + +- [ ] Create smoke test checklist. +- [ ] Create multiplayer test checklist. +- [ ] Create persistence test checklist. +- [ ] Create performance test checklist. +- [ ] Create release candidate checklist. +- [ ] Add bug triage workflow. +- [ ] Add crash reporting plan. +- [ ] Add automated build validation. +- [ ] Add test server reset process. + +## K. Build And Release Pipeline + +- [ ] Define dev build process. +- [ ] Define internal test build process. +- [ ] Define closed alpha build process. +- [ ] Define dedicated server packaging. +- [ ] Define patch distribution. +- [ ] Define version numbering. +- [ ] Define changelog format. +- [ ] Define rollback process. +- [ ] Define release approval checklist. + +## L. Community And Marketing + +- [ ] Keep agrariangame.com updated. +- [ ] Publish development updates. +- [ ] Collect launch list signups. +- [ ] Create Discord plan. +- [ ] Create devlog schedule. +- [ ] Create Steam page checklist. +- [ ] Create press kit. +- [ ] Create creator outreach list. +- [ ] Create early tester application. +- [ ] Create public roadmap page later. + +--- + +# Six-Month MVP Calendar + +## Month 1 - Foundation + +- [ ] Clean project structure. +- [ ] Confirm engine version. +- [ ] Set source control. +- [ ] Create base character. +- [ ] Create interaction system. +- [ ] Create first test map. +- [ ] Create stat component. +- [ ] Create inventory prototype. +- [ ] Create networking baseline. +- [ ] Create build instructions. + +## Month 2 - Survival Loop + +- [ ] Add hunger. +- [ ] Add thirst. +- [ ] Add health. +- [ ] Add stamina. +- [ ] Add weather. +- [ ] Add body temperature. +- [ ] Add gatherable resources. +- [ ] Add campfire. +- [ ] Add basic crafting. +- [ ] Add basic HUD. + +## Month 3 - Shelter And Persistence + +- [ ] Add building placement. +- [ ] Add primitive shelter. +- [ ] Add storage container. +- [ ] Add save/load for players. +- [ ] Add save/load for structures. +- [ ] Add save/load for containers. +- [ ] Add server restart persistence test. +- [ ] Add one full day/night survival test. + +## Month 4 - Multiplayer And Wildlife + +- [ ] Add dedicated server build. +- [ ] Add join flow. +- [ ] Add replicated inventory validation. +- [ ] Add replicated building validation. +- [ ] Add wildlife prototype. +- [ ] Add harvesting. +- [ ] Add injury placeholder. +- [ ] Add reconnect test. +- [ ] Add 2-4 player internal test. + +## Month 5 - Homestead Seeds And Economy Planning + +- [ ] Add land claim prototype. +- [ ] Add farming prototype if feasible. +- [ ] Add simple barter placeholder if feasible. +- [ ] Define AGR integration design. +- [ ] Define account/wallet bridge design. +- [ ] Add admin commands. +- [ ] Add test feedback form/process. +- [ ] Improve UI clarity. + +## Month 6 - Closed MVP Readiness + +- [ ] Stabilize server. +- [ ] Fix critical bugs. +- [ ] Optimize core map. +- [ ] Improve first 30 minutes of play. +- [ ] Add onboarding prompts. +- [ ] Add settings menu. +- [ ] Package client build. +- [ ] Package server build. +- [ ] Run closed internal test. +- [ ] Prepare external tester plan. +- [ ] Update website with progress. + +--- + +# Definition Of Done For The First Playable MVP + +The first playable MVP is not complete until: + +- [ ] Two or more players can join the same server. +- [ ] Players can gather resources. +- [ ] Players can craft at least one tool. +- [ ] Players can create fire. +- [ ] Players can build a primitive shelter. +- [ ] Weather and time affect survival. +- [ ] Hunger and thirst matter. +- [ ] Injury or damage can create meaningful risk. +- [ ] At least one wildlife system exists. +- [ ] Inventory works and replicates. +- [ ] Server restart preserves core state. +- [ ] The game communicates what to do without hand-holding too much. +- [ ] The experience feels like the beginning of Agrarian, not a generic survival template. + +--- + +# Near-Term Next Actions + +- [ ] Mount or create reliable local access path to the NAS `shared_drive` project. +- [ ] Decide whether to create a Git repository for the Unreal project. +- [ ] Inspect `Source/` and current Unreal project structure. +- [ ] Confirm Unreal Engine version. +- [ ] Confirm whether existing project opens cleanly. +- [ ] Confirm whether it compiles cleanly. +- [ ] Create Phase 0 task board from this roadmap. +- [ ] Start with base character, interaction, stats, inventory, and test map. diff --git a/AGRARIAN_FOUNDATION_STATUS.md b/AGRARIAN_FOUNDATION_STATUS.md new file mode 100644 index 0000000..266d283 --- /dev/null +++ b/AGRARIAN_FOUNDATION_STATUS.md @@ -0,0 +1,44 @@ +# Agrarian Foundation Status + +## Completed Foundation Work + +- [x] Master vision preserved in project root. +- [x] Comprehensive development roadmap preserved in project root. +- [x] Phase 1 C++ survival foundation started. +- [x] Replicated survival component added. +- [x] Replicated inventory component added. +- [x] Interaction interface added. +- [x] Resource node actor added. +- [x] Campfire actor added. +- [x] Primitive shelter actor added. +- [x] World time/weather game state added. +- [x] Primitive crafting component added. +- [x] Save game data structures added. +- [x] Persistence subsystem scaffold added. +- [x] Character now owns survival, inventory, and crafting components. +- [x] Character has server-authoritative interaction path. +- [x] Git ignore and Git LFS attribute prep files added. + +## Next Unreal Editor Tasks + +- [ ] Compile project from Visual Studio. +- [ ] Fix any C++ compiler/UHT errors. +- [ ] Create `IA_Interact` input action. +- [ ] Bind `IA_Interact` to `E` and a gamepad button. +- [ ] Assign `IA_Interact` to the character Blueprint's `InteractAction`. +- [ ] Create Blueprint child `BP_AGR_Resource_Wood` from `AgrarianResourceNode`. +- [ ] Create Blueprint child `BP_AGR_Campfire` from `AgrarianCampfire`. +- [ ] Create Blueprint child `BP_AGR_PrimitiveShelter` from `AgrarianShelterActor`. +- [ ] Assign placeholder meshes to MVP actors. +- [ ] Place resource nodes and campfire in the test map. +- [ ] Add simple HUD/debug display for survival and inventory. +- [ ] Test gather -> inventory -> campfire loop. + +## Next C++ Foundation Tasks + +- [ ] Add building placement component. +- [ ] Add simple crafting recipe defaults or data asset pipeline. +- [ ] Add item definition data asset class. +- [ ] Add save/load capture for placed actors. +- [ ] Add admin/dev console commands. +- [ ] Add wildlife base actor. diff --git a/AGRARIAN_MASTER_VISION.md b/AGRARIAN_MASTER_VISION.md new file mode 100644 index 0000000..3987861 --- /dev/null +++ b/AGRARIAN_MASTER_VISION.md @@ -0,0 +1,620 @@ +# AGRARIAN + +## Master Vision, Narrative, Roadmap & Business Strategy + +## What Is Agrarian? + +Agrarian is a persistent generational civilization simulator set on a continuously evolving Earth-scale world where players rebuild humanity through survival, stewardship, family, labor, trade, governance, and technological progress. + +Players begin with almost nothing. + +A fire. A crude shelter. A winter approaching. A world larger than they understand. + +From those beginnings, generations of players slowly shape civilization itself. + +Some will remain wanderers. Some will build homesteads. Some will create villages. Some will found nations. Some will destroy them. + +Over centuries of in-game history, the world evolves continuously through player actions, environmental systems, economics, migration, politics, war, agriculture, infrastructure, and inherited knowledge. + +Nothing wipes. Nothing resets. History persists. + +Agrarian is not designed as a traditional MMO. + +It is designed as a living civilization project. + +## The Core Philosophy + +Agrarian is built around several foundational ideas: + +### Civilization Is Built, Not Spawned + +Every road, field, bridge, town, and city exists because someone survived long enough to build it. + +### Legacy Matters More Than Levels + +Characters die. Civilizations endure. + +### The Frontier Always Exists Somewhere + +New players are never locked out of meaningful beginnings because the world constantly evolves through migration, collapse, expansion, and rediscovery. + +### Knowledge Is Humanity's True Progression System + +Survival knowledge, logistics, farming, engineering, diplomacy, leadership, and teaching matter more than simple stat inflation. + +### History Is Never Erased + +The world remembers what players build. + +Ruins remain. Empires leave scars. Ancient roads still connect cities generations later. + +### The World Is The Expansion + +There are no wipes, no sequels, and no fragmented expansion packs. Development continuously expands and evolves the same persistent world. + +## The Emotional Core + +Agrarian is ultimately about one question: + +> What survives after you are gone? + +The emotional center of the game is not power fantasy. + +It is: + +- stewardship +- mortality +- inheritance +- civilization +- continuity +- humanity's relationship with land, labor, and time + +## World Narrative + +Human civilization once reached extraordinary heights before collapse fractured the world into isolated survivors and scattered communities. + +The old world was not entirely destroyed. Its remnants still exist: + +- crumbling infrastructure +- abandoned machinery +- forgotten knowledge +- overgrown ruins +- fragmented records +- distant myths + +Most players begin knowing almost nothing about the world beyond survival. + +For many generations, humanity's focus is simple: + +- survive winter +- cultivate food +- protect family +- establish shelter +- preserve knowledge + +Only much later do larger questions begin to emerge: + +- What came before? +- How large is the world? +- What exists beyond the horizon? +- What lies across oceans? +- What are the lights in the sky? + +In the earliest eras of Agrarian, space is not a destination. + +It is mythology. + +A child standing in a field at night may look upward and wonder what exists beyond Earth, but the reality of reaching it feels impossibly distant. + +That distance matters. + +Humanity must first relearn how to survive before it can dream of reaching the stars again. + +## Long-Term Civilization Arc + +The world evolves through eras shaped entirely by player activity. + +### Survival Era + +Small groups struggle to survive harsh environments. + +### Agrarian Era + +Farming, domestication, trade, and settlements emerge. + +### Civic Era + +Governments, economies, law, infrastructure, and organized societies develop. + +### Industrial Era + +Mechanization, large-scale production, transportation, and global trade reshape civilization. + +### Automation Era + +Advanced infrastructure, robotics, AI-assisted labor, and highly complex economies emerge. + +### Orbital Era + +Only after centuries of development do the first serious attempts to reach beyond Earth become possible. + +Even then: + +- space travel is dangerous +- expensive +- rare +- difficult to maintain +- politically significant + +The stars remain a distant frontier for a very long time. + +## Space Expansion Philosophy + +Space is not an expansion pack. + +It is the next frontier of human civilization. + +The first players who eventually leave Earth should feel like: + +- early explorers +- settlers +- navigators +- astronauts +- pioneers crossing into the unknown + +Interplanetary travel should require: + +- massive infrastructure +- industrial capability +- advanced physics +- fuel logistics +- navigation +- ship maintenance +- life support +- coordinated civilizations + +Earth always remains emotionally central. + +Players may travel beyond Earth eventually, but: + +- ancestral homes remain +- old civilizations remain +- inherited land remains +- history remains + +The story of humanity never abandons Earth. It expands outward from it. + +## Gameplay Structure + +### Survival + +- gathering +- hunting +- shelter +- fire +- weather survival +- primitive crafting + +### Homesteading + +- farming +- irrigation +- domestication +- preservation +- permanent structures +- land stewardship + +### Civilization + +- trade +- infrastructure +- governance +- law +- migration +- taxation +- diplomacy +- warfare + +### Technological Progression + +- engineering +- industrialization +- automation +- robotics +- advanced logistics + +### Long-Term Exploration + +- advanced science +- orbital technology +- interplanetary infrastructure +- deep frontier expansion + +## Character & Generational Systems + +Every player begins as an individual human being with randomized capabilities: + +- strength +- endurance +- resilience +- intelligence +- craftsmanship +- charisma +- perception +- adaptability + +As characters age: + +- physical abilities decline +- knowledge increases +- efficiency improves +- teaching becomes more valuable + +When players die: + +- descendants inherit knowledge +- families inherit infrastructure +- civilizations inherit history + +If no lineage survives, the player begins again as a new individual somewhere on the frontier. + +Death is permanent. Civilization persists. + +## Economy + +Agrarian Coin (AGR) functions as the world's primary currency and economic backbone. + +The economy is entirely player-driven: + +- labor +- trade +- production +- transportation +- land value +- infrastructure +- scarcity +- specialization + +Players may: + +- own land +- establish businesses +- rent property +- hire labor +- collect taxes +- build industries +- trade internationally + +AGR integrates directly into the game's persistent economy. + +AGR also retains the real-world community purpose that started the project: use by homesteaders, farmers markets, agriculture, forestry, fishing, tradespeople, and local barter-minded commerce. + +## Monetization Philosophy + +Agrarian rejects: + +- pay-to-win mechanics +- battle passes +- loot boxes +- seasonal wipes +- fragmented DLC ecosystems + +The model is: + +- one-time purchase +- modest monthly subscription +- continuous world evolution + +Players support: + +- persistent servers +- long-term development +- world expansion +- infrastructure growth + +The game grows continuously rather than resetting every few years. + +## Development Roadmap + +### PHASE 1 - Foundational Survival MVP + +Goal: Prove the survival gameplay loop. + +Team Size: 2 developers. + +Deliverable: Small playable multiplayer prototype. + +Features: + +- single biome +- weather +- hunger/thirst +- injury +- primitive crafting +- wildlife +- gathering +- shelter building +- inventory +- stat system +- basic multiplayer + +### PHASE 2 - Persistent Homesteading + +Goal: Transition from temporary survival into persistent settlement. + +Features: + +- farming +- domestication +- land claiming +- storage +- food preservation +- persistent structures +- simple economy + +Deliverable: Players can establish permanent homesteads. + +### PHASE 3 - Social Civilization Systems + +Goal: Create meaningful player societies. + +Features: + +- trade +- reputation +- barter +- contracts +- local governance +- theft/crime systems +- alliances +- migration systems + +Deliverable: Emergent player communities form organically. + +### PHASE 4 - Generational Gameplay + +Goal: Introduce inheritance and mortality. + +Features: + +- aging +- relationships +- children +- lineage +- inheritance +- apprenticeships +- family systems +- permanent death + +Deliverable: The game evolves into a true generational simulator. + +### PHASE 5 - Governments & Civilization + +Goal: Enable civilization-scale gameplay. + +Features: + +- cities +- citizenship +- taxation +- diplomacy +- military systems +- war +- law systems +- territorial control + +Deliverable: Player-created civilizations emerge. + +### PHASE 6 - Dynamic Civilization Cycles + +Goal: Preserve long-term world sustainability. + +Features: + +- soil exhaustion +- climate variation +- disease +- infrastructure decay +- resource depletion +- societal instability +- frontier emergence +- migration waves + +Deliverable: The world remains permanently dynamic for future generations of players. + +### PHASE 7 - Earth-Scale Expansion + +Goal: Expand toward a planetary persistent simulation. + +Features: + +- large-scale terrain integration +- biome diversity +- global logistics +- regional climates +- continental economies +- massive server scaling + +### PHASE 8 - Industrial & Automation Era + +Goal: Advance civilization technologically. + +Features: + +- industrial systems +- power generation +- automation +- robotics +- advanced transportation +- large-scale infrastructure + +### PHASE 9 - Orbital Foundations + +Goal: Introduce the first steps toward space. + +Features: + +- astronomy +- observatories +- advanced physics +- launch infrastructure +- orbital engineering +- rare spaceflight capability + +Deliverable: Humanity begins looking beyond Earth again. + +### PHASE 10 - Interplanetary Frontier + +Goal: Open the next frontier. + +Features: + +- interplanetary travel +- colony logistics +- spacecraft maintenance +- orbital economies +- planetary settlement systems + +Deliverable: Civilization expands beyond Earth while remaining part of the same continuous historical world. + +## BUSINESS ROADMAP + +### Stage 1 - Foundation & Prototype + +Objective: Build credibility and proof of concept. + +Priorities: + +- Unreal Engine prototype +- networking foundation +- visual identity +- technical feasibility +- devlogs +- early website +- Discord community + +Revenue: None initially. + +Funding: Self-funded. + +Goal: Create a compelling playable prototype and establish public identity. + +### Stage 2 - Early Community Building + +Objective: Build visibility before launch. + +Priorities: + +- YouTube development logs +- TikTok short-form clips +- Reddit engagement +- survival/simulation community outreach +- developer transparency +- Steam page launch +- wishlist campaign + +Goal Metrics: + +- 25k-100k Steam wishlists +- active Discord +- core community advocates + +### Stage 3 - Closed Alpha + +Objective: Validate systems with real players. + +Distribution: + +- Direct launcher or Steam playtest + +Priorities: + +- server stability +- survival gameplay +- persistence testing +- community moderation +- patch cadence + +Revenue: + +- Optional founder packs only if necessary +- Avoid aggressive monetization + +### Stage 4 - Early Access Launch + +Platforms: + +- Primary: Valve Corporation via Steam +- Secondary later: Epic Games + +Avoid console launch initially. + +Revenue Model: + +- one-time purchase +- optional modest subscription once persistence/server costs justify it + +Goal: Build sustainable recurring revenue without compromising philosophy. + +### Stage 5 - Infrastructure Expansion + +Objective: Scale server infrastructure carefully. + +Priorities: + +- regional servers +- persistence optimization +- anti-cheat +- world partitioning +- account systems +- moderation tools + +Team Growth: + +- networking engineer +- backend engineer +- technical artist +- community manager + +Avoid explosive scaling too early. + +### Stage 6 - Long-Term Studio Evolution + +Objective: Transition from indie prototype team into sustainable long-term studio. + +Philosophy: + +Remain focused on: + +- continuity +- transparency +- player trust +- sustainable growth +- long-term world stewardship + +Do not pivot into: + +- hyper-monetization +- rapid sequel cycles +- trend-chasing live-service mechanics + +The strength of Agrarian is its consistency of vision. + +## Marketing Position + +Agrarian should feel less like: + +> a game releasing this year + +and more like: + +> the beginning of a long-term digital civilization. + +## Core Marketing Lines + +- The World Is The Expansion. +- History Is Never Erased. +- Civilization Is Player Created. +- Legacy Matters More Than Levels. +- Every Empire Began With Someone Surviving Their First Winter. +- What Survives After You Are Gone? diff --git a/AGRARIAN_MVP_IMPLEMENTATION_NOTES.md b/AGRARIAN_MVP_IMPLEMENTATION_NOTES.md new file mode 100644 index 0000000..3583226 --- /dev/null +++ b/AGRARIAN_MVP_IMPLEMENTATION_NOTES.md @@ -0,0 +1,84 @@ +# Agrarian MVP Implementation Notes + +This first implementation creates the C++ foundation for the Phase 1 survival MVP. It is intentionally small and system-oriented: the goal is to make the first playable loop possible without creating throwaway prototype logic that will have to be replaced later. + +## Added C++ Systems + +- `AgrarianTypes` + - Shared item, survival, and weather data types. +- `AgrarianInteractable` + - Interface for anything the player can use/gather/activate. +- `AgrarianSurvivalComponent` + - Replicated health, stamina, hunger, thirst, body temperature, and injury state. + - Server-authoritative decay and survival damage. + - Basic ambient temperature exposure from `AgrarianGameState`. +- `AgrarianInventoryComponent` + - Replicated inventory item stacks. + - Server-authoritative add/remove helpers. +- `AgrarianGameState` + - Replicated world time, weather state, and ambient temperature. +- `AgrarianResourceNode` + - Interactable gatherable actor that grants inventory items and depletes. +- `AgrarianCampfire` + - Interactable fire actor using wood as fuel. + - Applies warmth to nearby characters. +- `AgrarianShelterActor` + - Primitive replicated shelter actor with a protection volume placeholder. +- `AgrarianGameCharacter` + - Now owns survival and inventory components. + - Has a server-authoritative interaction trace flow. +- `AgrarianGameGameMode` + - Now uses `AgrarianGameState`. + +## What This Enables Immediately + +With simple Blueprint children and placeholder meshes, the project can now support: + +- A player with replicated survival stats. +- A player inventory. +- Gathering resource nodes into inventory. +- Lighting/feeding a campfire with gathered wood. +- Warmth from the campfire affecting body temperature. +- Replicated day/night/weather state. +- Primitive shelter placement as a world actor once a placement UI is added. + +## Required Editor Setup + +These C++ classes need Blueprint/content setup inside Unreal: + +- Create or update a player Blueprint derived from `AgrarianGameCharacter`. +- Assign the existing movement/look/jump input actions as before. +- Create an `IA_Interact` input action. +- Add `IA_Interact` to the active input mapping context, suggested key `E` / gamepad face button. +- Assign `IA_Interact` to the character's `InteractAction` property. +- Create Blueprint children: + - `BP_AGR_Resource_Wood` from `AgrarianResourceNode` + - `BP_AGR_Campfire` from `AgrarianCampfire` + - `BP_AGR_PrimitiveShelter` from `AgrarianShelterActor` +- Assign placeholder meshes to each Blueprint. +- Place several resource nodes and at least one campfire in the test map. +- Confirm the active GameMode derives from `AgrarianGameGameMode`. + +## First Playable Test + +The first playable test should verify: + +- Start the map as one player. +- Look at a resource node and press interact. +- Wood appears in the player's inventory component. +- Interact with the campfire. +- One wood is removed and the campfire lights. +- Standing near the lit campfire raises/maintains body temperature. +- Hunger and thirst decay over time. +- Server authority is respected in multiplayer. + +## Known Limits + +- No visual HUD has been added yet. +- No crafting UI has been added yet. +- No building placement flow has been added yet. +- No save/load persistence has been added yet. +- No wildlife has been added yet. +- No packaged build was compiled in this environment. + +These are the next MVP tasks, not blockers for this foundation. diff --git a/AgrarianGame.uproject b/AgrarianGame.uproject new file mode 100644 index 0000000..d33898c --- /dev/null +++ b/AgrarianGame.uproject @@ -0,0 +1,38 @@ +{ + "FileVersion": 3, + "EngineAssociation": "5.7", + "Category": "", + "Description": "", + "Modules": [ + { + "Name": "AgrarianGame", + "Type": "Runtime", + "LoadingPhase": "Default" + } + ], + "Plugins": [ + { + "Name": "ModelingToolsEditorMode", + "Enabled": true + }, + { + "Name": "StateTree", + "Enabled": true + }, + { + "Name": "GameplayStateTree", + "Enabled": true + }, + { + "Name": "VisualStudioTools", + "Enabled": true, + "SupportedTargetPlatforms": [ + "Win64" + ] + } + ], + "TargetPlatforms": [], + "AdditionalRootDirectories": [], + "AdditionalPluginDirectories": [], + "EpicSampleNameHash": "" +} \ No newline at end of file diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini new file mode 100644 index 0000000..79b70b5 --- /dev/null +++ b/Config/DefaultEditor.ini @@ -0,0 +1,9 @@ +[UnrealEd.SimpleMap] +SimpleMapName=/Game/ThirdPersonCPP/Maps/ThirdPersonExampleMap + +[EditoronlyBP] +bAllowClassAndBlueprintPinMatching=true +bReplaceBlueprintWithClass= true +bDontLoadBlueprintOutsideEditor= true +bBlueprintIsNotBlueprintType= true + diff --git a/Config/DefaultEditorPerProjectUserSettings.ini b/Config/DefaultEditorPerProjectUserSettings.ini new file mode 100644 index 0000000..4dcc526 --- /dev/null +++ b/Config/DefaultEditorPerProjectUserSettings.ini @@ -0,0 +1,2 @@ +[ContentBrowser] +ContentBrowserTab1.SelectedPaths=/Game/ThirdPersonCPP \ No newline at end of file diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini new file mode 100644 index 0000000..47ec6a8 --- /dev/null +++ b/Config/DefaultEngine.ini @@ -0,0 +1,258 @@ +[/Script/EngineSettings.GameMapsSettings] +GameDefaultMap=/Game/ThirdPerson/Lvl_ThirdPerson.Lvl_ThirdPerson +EditorStartupMap=/Game/ThirdPerson/Lvl_ThirdPerson.Lvl_ThirdPerson +GlobalDefaultGameMode=/Game/ThirdPerson/Blueprints/BP_ThirdPersonGameMode.BP_ThirdPersonGameMode_C + +[/Script/Engine.RendererSettings] +r.Mobile.ShadingPath=1 +r.Mobile.AntiAliasing=2 +r.Mobile.FloatPrecisionMode=0 +r.Mobile.AllowDitheredLODTransition=False +r.Mobile.VirtualTextures=False +r.DiscardUnusedQuality=False +r.AllowOcclusionQueries=True +r.MinScreenRadiusForLights=0.030000 +r.MinScreenRadiusForDepthPrepass=0.030000 +r.PrecomputedVisibilityWarning=False +r.TextureStreaming=True +Compat.UseDXT5NormalMaps=False +r.VirtualTextures=True +r.VirtualTexturedLightmaps=False +r.VT.TileSize=128 +r.VT.TileBorderSize=4 +r.VT.AnisotropicFiltering=False +r.VT.EnableAutoImport=False +bEnableVirtualTextureOpacityMask=True +r.MeshPaintVirtualTexture.Support=True +r.MeshPaintVirtualTexture.TileSize=32 +r.MeshPaintVirtualTexture.TileBorderSize=2 +r.MeshPaintVirtualTexture.UseCompression=True +r.StaticMesh.DefaultMeshPaintTextureSupport=True +r.MeshPaintVirtualTexture.DefaultTexelsPerVertex=4 +r.MeshPaintVirtualTexture.MaxTextureSize=4096 +r.vt.rvt.EnableBaseColor=True +r.vt.rvt.EnableBaseColorRoughness=True +r.vt.rvt.EnableBaseColorSpecular=True +r.vt.rvt.EnableMask4=True +r.vt.rvt.EnableWorldHeight=True +r.vt.rvt.EnableDisplacement=True +r.vt.rvt.HighQualityPerPixelHeight=True +WorkingColorSpaceChoice=sRGB +RedChromaticityCoordinate=(X=0.640000,Y=0.330000) +GreenChromaticityCoordinate=(X=0.300000,Y=0.600000) +BlueChromaticityCoordinate=(X=0.150000,Y=0.060000) +WhiteChromaticityCoordinate=(X=0.312700,Y=0.329000) +r.LegacyLuminanceFactors=False +r.ClearCoatNormal=False +r.DynamicGlobalIlluminationMethod=1 +r.ReflectionMethod=1 +r.ReflectionCaptureResolution=128 +r.ReflectionEnvironmentLightmapMixBasedOnRoughness=True +r.Lumen.HardwareRayTracing=True +r.Lumen.HardwareRayTracing.LightingMode=0 +r.Lumen.TranslucencyReflections.FrontLayer.EnableForProject=False +r.Lumen.TraceMeshSDFs=0 +r.Lumen.ScreenTracingSource=0 +r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject=True +r.MegaLights.EnableForProject=False +r.RayTracing.Shadows=False +r.Shadow.Virtual.Enable=1 +r.RayTracing=True +r.RayTracing.RayTracingProxies.ProjectEnabled=True +r.RayTracing.UseTextureLod=False +r.PathTracing=True +r.GenerateMeshDistanceFields=True +r.DistanceFields.DefaultVoxelDensity=0.200000 +r.Nanite.ProjectEnabled=True +r.AllowStaticLighting=False +r.NormalMapsForStaticLighting=False +r.ForwardShading=False +r.VertexFoggingForOpaque=True +r.SeparateTranslucency=True +r.TranslucentSortPolicy=0 +TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000) +r.LocalFogVolume.ApplyOnTranslucent=False +xr.VRS.FoveationLevel=0 +xr.VRS.DynamicFoveation=False +r.CustomDepth=1 +r.CustomDepthTemporalAAJitter=True +r.PostProcessing.PropagateAlpha=False +r.Deferred.SupportPrimitiveAlphaHoldout=False +r.DefaultFeature.Bloom=True +r.DefaultFeature.AmbientOcclusion=True +r.DefaultFeature.AmbientOcclusionStaticFraction=True +r.DefaultFeature.AutoExposure=False +r.DefaultFeature.AutoExposure.Method=0 +r.DefaultFeature.AutoExposure.Bias=1.000000 +r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True +r.DefaultFeature.LocalExposure.HighlightContrastScale=0.800000 +r.DefaultFeature.LocalExposure.ShadowContrastScale=0.800000 +r.DefaultFeature.MotionBlur=False +r.DefaultFeature.LensFlare=False +r.TemporalAA.Upsampling=True +r.AntiAliasingMethod=0 +r.MSAACount=4 +r.DefaultFeature.LightUnits=1 +r.DefaultBackBufferPixelFormat=4 +r.ScreenPercentage.Default=100.000000 +r.ScreenPercentage.Default.Desktop.Mode=1 +r.ScreenPercentage.Default.Mobile.Mode=0 +r.ScreenPercentage.Default.VR.Mode=0 +r.ScreenPercentage.Default.PathTracer.Mode=0 +r.Shadow.UnbuiltPreviewInGame=True +r.StencilForLODDither=False +r.EarlyZPass=3 +r.EarlyZPassOnlyMaterialMasking=False +r.Shadow.CSMCaching=False +r.DBuffer=True +r.ClearSceneMethod=1 +r.VelocityOutputPass=0 +r.Velocity.EnableVertexDeformation=2 +r.SelectiveBasePassOutputs=False +bDefaultParticleCutouts=False +fx.GPUSimulationTextureSizeX=1024 +fx.GPUSimulationTextureSizeY=1024 +r.AllowGlobalClipPlane=False +r.GBufferFormat=1 +r.MorphTarget.Mode=True +r.MorphTarget.MaxBlendWeight=5.000000 +r.SupportSkyAtmosphere=True +r.SupportSkyAtmosphereAffectsHeightFog=True +r.SupportExpFogMatchesVolumetricFog=False +r.SupportLocalFogVolumes=True +r.SupportCloudShadowOnForwardLitTranslucent=False +r.ClusteredDeferredShading.EnableForProject=True +r.LightFunctionAtlas.Format=0 +r.VolumetricFog.LightFunction=True +r.Deferred.UsesLightFunctionAtlas=True +r.SingleLayerWater.UsesLightFunctionAtlas=False +r.Translucent.UsesLightFunctionAtlas=False +r.Translucent.UsesIESProfiles=False +r.Translucent.UsesRectLights=False +r.Translucent.UsesShadowedLocalLights=False +r.GPUCrashDebugging=False +vr.InstancedStereo=False +r.MobileHDR=True +vr.MobileMultiView=False +r.Mobile.UseHWsRGBEncoding=False +vr.RoundRobinOcclusion=False +r.MeshStreaming=False +r.HeterogeneousVolumes=True +r.HeterogeneousVolumes.Shadows=False +r.Translucency.HeterogeneousVolumes=False +r.WireframeCullThreshold=5.000000 +r.SupportStationarySkylight=True +r.SupportLowQualityLightmaps=True +r.SupportPointLightWholeSceneShadows=True +r.Shadow.TranslucentPerObject.ProjectEnabled=False +r.Water.SingleLayerWater.SupportCloudShadow=False +r.Substrate=True +r.Substrate.ProjectGBufferFormat=0 +r.Substrate.ProjectClosuresPerPixel=4 +r.Substrate.ProjectClosuresPerPixelOverride=0 +r.Substrate.BytesPerPixel=80 +r.Substrate.OpaqueMaterialRoughRefraction=False +r.Refraction.Blur=True +r.Substrate.Debug.AdvancedVisualizationShaders=False +r.Substrate.EnableLayerSupport=False +r.Material.RoughDiffuse=False +r.Material.EnergyConservation=False +r.Material.DefaultAutoMaterialUsage=True +r.OIT.SortedPixels=False +r.HairStrands.LODMode=True +r.SkinCache.CompileShaders=True +r.VRS.Support=True +r.SkinCache.SkipCompilingGPUSkinVF=False +r.SkinCache.DefaultBehavior=1 +r.SkinCache.SceneMemoryLimitInMB=128.000000 +r.Mobile.EnableStaticAndCSMShadowReceivers=True +r.Mobile.EnableMovableLightCSMShaderCulling=True +r.Mobile.Forward.EnableLocalLights=1 +r.Mobile.Forward.EnableClusteredReflections=False +r.Mobile.AllowDistanceFieldShadows=True +r.Mobile.EnableMovableSpotlightsShadow=False +r.GPUSkin.Support16BitBoneIndex=False +r.GPUSkin.Limit2BoneInfluences=False +r.SupportDepthOnlyIndexBuffers=False +r.SupportReversedIndexBuffers=False +r.Mobile.AmbientOcclusion=False +r.Mobile.ScreenSpaceReflections=False +r.Mobile.DBuffer=False +r.Mobile.PropagateAlpha=False +r.GPUSkin.UnlimitedBoneInfluences=False +r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences=False +r.GPUSkin.UnlimitedBoneInfluencesThreshold=8 +DefaultBoneInfluenceLimit=(Default=0,PerPlatform=()) +MaxSkinBones=(Default=65536,PerPlatform=(("Mobile", 256))) +r.Nanite.Foliage=False +bStreamSkeletalMeshLODs=(Default=False,PerPlatform=()) +bDiscardSkeletalMeshOptionalLODs=(Default=False,PerPlatform=()) +VisualizeCalibrationColorMaterialPath=/Engine/EngineMaterials/PPM_DefaultCalibrationColor.PPM_DefaultCalibrationColor +VisualizeCalibrationCustomMaterialPath=None +VisualizeCalibrationGrayscaleMaterialPath=/Engine/EngineMaterials/PPM_DefaultCalibrationGrayscale.PPM_DefaultCalibrationGrayscale + +[/Script/WindowsTargetPlatform.WindowsTargetSettings] +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +-D3D12TargetedShaderFormats=PCD3D_SM5 ++D3D12TargetedShaderFormats=PCD3D_SM6 +-D3D11TargetedShaderFormats=PCD3D_SM5 ++D3D11TargetedShaderFormats=PCD3D_SM5 +Compiler=Default +AudioSampleRate=48000 +AudioCallbackBufferFrameSize=1024 +AudioNumBuffersToEnqueue=1 +AudioMaxChannels=0 +AudioNumSourceWorkers=4 +SpatializationPlugin= +SourceDataOverridePlugin= +ReverbPlugin= +OcclusionPlugin= +CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0) +CacheSizeKB=65536 +MaxChunkSizeOverrideKB=0 +bResampleForDevice=False +MaxSampleRate=48000.000000 +HighSampleRate=32000.000000 +MedSampleRate=24000.000000 +LowSampleRate=12000.000000 +MinSampleRate=8000.000000 +CompressionQualityModifier=1.000000 +AutoStreamingThreshold=0.000000 +SoundCueCookQualityIndex=-1 + +[/Script/LinuxTargetPlatform.LinuxTargetSettings] +-TargetedRHIs=SF_VULKAN_SM5 ++TargetedRHIs=SF_VULKAN_SM6 + +[/Script/MacTargetPlatform.MacTargetSettings] +-TargetedRHIs=SF_METAL_SM5 ++TargetedRHIs=SF_METAL_SM6 + +[/Script/HardwareTargeting.HardwareTargetingSettings] +TargetedHardwareClass=Desktop +AppliedTargetedHardwareClass=Desktop +DefaultGraphicsPerformance=Scalable +AppliedDefaultGraphicsPerformance=Scalable + +[/Script/Engine.Engine] ++ActiveGameNameRedirects=(OldGameName="TP_ThirdPerson",NewGameName="/Script/AgrarianGame") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPerson",NewGameName="/Script/AgrarianGame") ++ActiveClassRedirects=(OldClassName="TP_ThirdPersonPlayerController",NewClassName="AgrarianGamePlayerController") ++ActiveClassRedirects=(OldClassName="TP_ThirdPersonGameMode",NewClassName="AgrarianGameGameMode") ++ActiveClassRedirects=(OldClassName="TP_ThirdPersonCharacter",NewClassName="AgrarianGameCharacter") + +[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings] +bEnablePlugin=True +bAllowNetworkConnection=True +SecurityToken=75E5BDE441E4F070BBFBCE9EBE7BB8D9 +bIncludeInShipping=False +bAllowExternalStartInShipping=False +bCompileAFSProject=False +bUseCompression=False +bLogFiles=False +bReportStats=False +ConnectionType=USBOnly +bUseManualIPAddress=False +ManualIPAddress= + diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini new file mode 100644 index 0000000..d5c7bf1 --- /dev/null +++ b/Config/DefaultGame.ini @@ -0,0 +1,3 @@ +[/Script/EngineSettings.GeneralProjectSettings] +ProjectID=1C37CF214211E5FA6177D497FE103AC4 +ProjectName=Third Person Game Template diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini new file mode 100644 index 0000000..ad7bb00 --- /dev/null +++ b/Config/DefaultInput.ini @@ -0,0 +1,86 @@ + + +[/Script/Engine.InputSettings] +-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) ++AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +bAltEnterTogglesFullscreen=True +bF11TogglesFullscreen=True +bUseMouseForTouch=False +bEnableMouseSmoothing=True +bEnableFOVScaling=True +bCaptureMouseOnLaunch=True +bEnableLegacyInputScales=True +bEnableMotionControls=True +bFilterInputByPlatformUser=False +bShouldFlushPressedKeysOnViewportFocusLost=True +bAlwaysShowTouchInterface=False +bShowConsoleOnFourFingerTap=True +bEnableGestureRecognizer=False +bUseAutocorrect=False +DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown +DefaultViewportMouseLockMode=LockOnCapture +FOVScale=0.011110 +DoubleClickTime=0.200000 +DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput +DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent +DefaultTouchInterface=None +-ConsoleKeys=Tilde ++ConsoleKeys=Tilde + diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Back_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Back_01.uasset new file mode 100644 index 0000000..c85a68e --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Death/MM_Death_Back_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdee63c4a4dc23076dda04b32eb8505bcd41fb791e574a264026c43e700bf923 +size 308880 diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_01.uasset new file mode 100644 index 0000000..872ed0d --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9daa694dda4639b106a29401712b03376344b301b6161955a92ba64ea60ae6d +size 308516 diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_02.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_02.uasset new file mode 100644 index 0000000..4f2e86a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dda4f9d6a4c8fc3bf79458d4d2f490965ff01401256e90fdf98a938a58c61986 +size 314751 diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_03.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_03.uasset new file mode 100644 index 0000000..433faf3 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf3a411d465002756eb1a19cdb2bef63b75a57a9fab7ce121ee71941e010d2cc +size 277478 diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Left_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Left_01.uasset new file mode 100644 index 0000000..23913f5 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Death/MM_Death_Left_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:712a25024fe931bd518fff6c935b82bc0ee2070a77caef63edd0d6fc7ff66508 +size 283231 diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Right_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Right_01.uasset new file mode 100644 index 0000000..8522527 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Death/MM_Death_Right_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7968e7e1bc3d8e33c3f0d8479e6753d011ced0e05a831eb7f10e28ceb536b9a4 +size 302339 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/AO_Pistol.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/AO_Pistol.uasset new file mode 100644 index 0000000..09c6cb9 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Aim/AO_Pistol.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4f2fca2458488be2d05cb2188bd641293d06bdcc4e598feee59ba1b23156c24 +size 8824 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS1.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS1.uasset new file mode 100644 index 0000000..de05dfe --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d7113f1799219db01d8394c2984d5afd2957de07d66cfa463c9c33822e11d89 +size 2056489 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CD.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CD.uasset new file mode 100644 index 0000000..d8bcd5e --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2898b38d8ef305d1d2e285f519be72cde7e2b0106bb85657fda47e35dc27b15d +size 170203 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CU.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CU.uasset new file mode 100644 index 0000000..87979a4 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5c5855b58743d51bf1abe11b470749f50ae6074fac734da446d1c4a9b076650 +size 173260 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd.uasset new file mode 100644 index 0000000..7c6b7a1 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f93aacabf40a36d906896e5c5998e4a63445749efa25c973092b9ae82ef1477f +size 365135 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Left.uasset new file mode 100644 index 0000000..0070124 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc8a45c6259a8a51808ff3de4688302a65ce4988a05a5b0f70fbced01001ea6b +size 255387 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Right.uasset new file mode 100644 index 0000000..83ee01f --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6f80eb946a12e3056a53d67b8134f5e9bd028eb66333a8a665c13d6cf14d1ee +size 255329 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd.uasset new file mode 100644 index 0000000..3df932a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caba32a2584600031bca7cec76875e50eb80e4c1d6fea3e249f2532388d4f221 +size 432796 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Left.uasset new file mode 100644 index 0000000..becca7d --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ed2295bbfbbe7800395b2fc2023e082f6c9b2b7127dd6ceb5c7ec055486c39b +size 309345 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Right.uasset new file mode 100644 index 0000000..8eae18b --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d80c0c9bb0a8fae52095506f7f83c42bdd11b4d62ebfe57b1d9c7f40e8a9478a +size 309527 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Left.uasset new file mode 100644 index 0000000..da2b6e2 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d8fcf3a8b6e581f4d06bc4fe2b307e1dcdcc7432cc114173c201a0115cad2c9 +size 310960 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Right.uasset new file mode 100644 index 0000000..af99ac7 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:017f902b0a80b4fff2115c5c39f640b7622ad562a0ec137d25aae61d511d0b53 +size 354844 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Fall_Loop.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Fall_Loop.uasset new file mode 100644 index 0000000..3fe2d39 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Fall_Loop.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b01836fa36515fcb523644e82f2f130289a69a14314b6b939d5a580b3c5950e +size 255338 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_RecoveryAdditive.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_RecoveryAdditive.uasset new file mode 100644 index 0000000..f91bd42 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_RecoveryAdditive.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9935321b5ee3fe9445cfa2a6c9f0d0391d888fbb9db71b1eaf76b3bc5345d6d +size 268356 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Start.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Start.uasset new file mode 100644 index 0000000..dd5b3ba --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Start.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58c1e69b2690611740c465f92e3763fd9747b9a6e75fe6a7629b16c5fcc37e7a +size 144542 diff --git a/Content/Characters/Mannequins/Anims/Pistol/MF_Pistol_Idle_ADS.uasset b/Content/Characters/Mannequins/Anims/Pistol/MF_Pistol_Idle_ADS.uasset new file mode 100644 index 0000000..9c0c6c1 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/MF_Pistol_Idle_ADS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:766a02544f06604946d8c47c47c6bb877e14208904306188bc1f5b174fd7715b +size 2068319 diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_DryFire.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_DryFire.uasset new file mode 100644 index 0000000..5934d4a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_DryFire.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64b3c6dc7357f8a1b380057ef76e1cbb984d69e7d0732eaefd70befe2be7b67f +size 250601 diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Equip.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Equip.uasset new file mode 100644 index 0000000..d587bf4 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Equip.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f5a1ed2c1b72a9bb27b417cb0d5315440af2b22b7b846254fbce50e2fbb3d17 +size 360966 diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire.uasset new file mode 100644 index 0000000..c91f713 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebd8467dbb3de5ba0e1b2eac0092352e270b37e616bc443872341cde2f5c22d8 +size 186765 diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire_Montage.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire_Montage.uasset new file mode 100644 index 0000000..7ed013a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire_Montage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eabacc1911be6c5b0dff7cf8a5c29c0506a25ffa6f3e7fa5946e76f992e38ee +size 10119 diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Reload.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Reload.uasset new file mode 100644 index 0000000..e0d89c5 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Reload.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a821a774302ce5121efff744620da09587752290e35e4413b8e40db8ad9c0391 +size 479562 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd.uasset new file mode 100644 index 0000000..02f7239 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:704dd7e116a755b086a8d685321f23e332bba6cb77dd6ae95542d38c462feb9b +size 545138 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Left.uasset new file mode 100644 index 0000000..9bf73a9 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fff084ed3ca270a8d926f810f078a69347507851744cf399f3142c97e36e2fa6 +size 450957 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Right.uasset new file mode 100644 index 0000000..3433b01 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26a82255db90c0dc4e8c01d52a55f73b5f5a532ef161812faf63be65869f3504 +size 451022 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd.uasset new file mode 100644 index 0000000..fd5ea12 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ac6171e3b841b09fff67dc4162b0c70f99f3107f549a20a213d5e05405dc69e +size 474209 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Left.uasset new file mode 100644 index 0000000..1b7772a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdd682c2a45cf6a73a34df6499f8bb4ccf8b68a42b8888c47b8532bfecb200d1 +size 374604 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Right.uasset new file mode 100644 index 0000000..7d4b7af --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9b42e230d6fdf9f4f836592507c3f8a17dfd76d7b054b78b633a11722f94100 +size 374748 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Left.uasset new file mode 100644 index 0000000..e9476dc --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc5f5b9f355e755023d1aa153070a073156f6d902b08e7cf78463f5e0bc8f629 +size 580040 diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Right.uasset new file mode 100644 index 0000000..64066c5 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e72f68c9a306ec44f7bc4f37e3533f2918ee19d99a1d8e60986036f2a4405d68 +size 498997 diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/AO_Rifle.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/AO_Rifle.uasset new file mode 100644 index 0000000..c1aa1e4 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/AIM/AO_Rifle.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3cfb9e380d881fa8561df0515f4ff24d96af4d3e1430df829c7ede641a12b1d +size 10402 diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CC.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CC.uasset new file mode 100644 index 0000000..3ba8298 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9521c1941980dc784cedb3df736d7c1edf56afaa0201f28b41c5ae9923e88bbb +size 94995 diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CD.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CD.uasset new file mode 100644 index 0000000..f7924fd --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09b2c98aa7778b6a970b0d90882555cf920c03d761f1e50bb3feaf0e3c9a6fef +size 94882 diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CU.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CU.uasset new file mode 100644 index 0000000..87d829d --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60969c39ff3c1bd1e30e7c728a9dbe49c236857659b1ae8d20ae7605d8152324 +size 95154 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset new file mode 100644 index 0000000..7b4194d --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecb41ae9339d797408a7b9c0270dc1f917b680a21f1c189ac0e3890f41185e0b +size 252342 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset new file mode 100644 index 0000000..483ec0b --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5caf5938c73d131c9254c1af09cb7fd4335516c9a406be77c17ad5e1f2cdebe +size 247961 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset new file mode 100644 index 0000000..dbd7889 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae8728f698434dd1e63978d5d92c5984d086d7ee39ce618598122b6fa87dc820 +size 224756 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset new file mode 100644 index 0000000..d318702 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcb6c068d81d5be1d84c88895805eb29c2f3f345668a10884836f00759b0647b +size 238345 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset new file mode 100644 index 0000000..a09a2a2 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3949df1228e6c14047477538424f9440216915a0637da33cf6c7298400128073 +size 281622 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset new file mode 100644 index 0000000..9899964 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0ed26de9c333968631cc040e82aebac289a2fd655a1f348a3b09ce3b40f1ef5 +size 318893 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset new file mode 100644 index 0000000..465ace3 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cca3c893d68d8270a9eec9eb7572f7ed6bfcfdf6ce6345dc8b2860d6135dbe00 +size 225043 diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset new file mode 100644 index 0000000..ce6866f --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3acb6956f9eb6512e386b575c4c3e390f7d0280b037ca52e0eef813fb1f729d6 +size 234402 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd.uasset new file mode 100644 index 0000000..de688c3 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fd489f5c8d4d63e84f8a25c2db46c3ae54eae828212b2a32622726e593b5d3c +size 582054 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Left.uasset new file mode 100644 index 0000000..79072a7 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3939c4aa298e6be0834256ef6f642cff0465a40d676ec7e464aaf504b44f729 +size 458365 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Right.uasset new file mode 100644 index 0000000..e42e504 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:907cb106c1c466aac0b38753b7551af73a09c082a652c82c43df5418eb33b089 +size 458272 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd.uasset new file mode 100644 index 0000000..35c75f8 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:287d39883a65ccf6f89d91c7ca13b23184f04ae6eb5cc3867dd7ef7cfb35ec1c +size 516328 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Left.uasset new file mode 100644 index 0000000..dd03faa --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4103ea6388d484e8f71cd30b955c3c954750d922a0c030bf3d902bdb3e02c13d +size 384314 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Right.uasset new file mode 100644 index 0000000..5848d2f --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ca8d8ec88d086d4cb6027a2eefdde258142587bca40e98dee021abe9c8824f8 +size 384322 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Left.uasset new file mode 100644 index 0000000..a905992 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4feaf1bd5b370e28f5dce611b28d955bbf84bbeb72b7e22972a0e143022621a7 +size 296415 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Right.uasset new file mode 100644 index 0000000..99700e1 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3c5cae5448dbb8c4e3bda5406202a8e55b08247695082270e1fef3dbdd6e533 +size 420984 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Apex.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Apex.uasset new file mode 100644 index 0000000..abb9e3a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Apex.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39acbd6bcfc5ec2795ee2497bb353fbe954766bda545c3318c3cd6ee5f1ee008 +size 228355 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Land.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Land.uasset new file mode 100644 index 0000000..c222c84 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Land.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce74e83b9b88fa3722951c1c6b2cc36ae7159b8141f5347e5b47d760cee41c42 +size 179028 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Loop.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Loop.uasset new file mode 100644 index 0000000..8045d17 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Loop.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d17c0a4fe1d9bb970b3208909e1c35b7183568c7968a0d6d0de391cca216b472 +size 645680 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_RecoveryAdditive.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_RecoveryAdditive.uasset new file mode 100644 index 0000000..15cd154 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_RecoveryAdditive.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d663743ac0fd361303751c55688a34053fbed145aaa88a004abd7b02533d5e5 +size 294517 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start.uasset new file mode 100644 index 0000000..d0acb23 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:925f27182be45054a1bbb5d458cb53d38773b356dd61e18b82fa9a72880dc8e7 +size 146783 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start_Loop.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start_Loop.uasset new file mode 100644 index 0000000..12c60ea --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start_Loop.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2da3d291df2070e1aaa62a45e445a7979948489b9e811e0d17f94b3e627d14e +size 441727 diff --git a/Content/Characters/Mannequins/Anims/Rifle/MF_Rifle_Idle_ADS.uasset b/Content/Characters/Mannequins/Anims/Rifle/MF_Rifle_Idle_ADS.uasset new file mode 100644 index 0000000..faeb9dd --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/MF_Rifle_Idle_ADS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfa32b19207a25546bb5bc2dde8454dc633cc27c3de45747e941756e23da5d4d +size 1700234 diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_DryFire.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_DryFire.uasset new file mode 100644 index 0000000..730cf5f --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_DryFire.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:131e01f0a31f999e7fd09ef190b314314c851f39101412161dabdb00d2dda801 +size 249623 diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Equip.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Equip.uasset new file mode 100644 index 0000000..5227639 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Equip.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:136b19498b8bac4119dde48236d22127e8463c0becff775069e0b6399b7939d6 +size 416648 diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Fire.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Fire.uasset new file mode 100644 index 0000000..e51bd26 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Fire.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c5b983bd6c09431c83866f772ccf13871ad9626426c86cc08a0c87c150555f7 +size 184600 diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Reload.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Reload.uasset new file mode 100644 index 0000000..a182e4e --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Reload.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac1e17d2acb7e3cea6e4c9ca967400dc3052d5ec6514e155b33d8e4701e80784 +size 547351 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd.uasset new file mode 100644 index 0000000..23e2aa5 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1400dc7a7bfca224e0aa7796e5c230236ad634c808b2a1540cbad8903fa897b +size 449720 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Left.uasset new file mode 100644 index 0000000..03fdab7 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d535eb181e756f56974efae068f34da050747fd8836fe2bb5f0c693f51325c2 +size 332682 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Right.uasset new file mode 100644 index 0000000..414bc2a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e0bd9b3ba2e982ac9ffd60a643dab78cf886d194a26af518170a02dc4f3eac0 +size 332577 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd.uasset new file mode 100644 index 0000000..59307ae --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:540a6a77c48027e13be84d483c6afd18d82fb115b7532334597ebefe2249ecd0 +size 490267 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Left.uasset new file mode 100644 index 0000000..b9e3ebe --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7797a7841cb86c3dc9e68dcdf968e538c9a7335abb1b0d9db95e0983b2226d7 +size 384794 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Right.uasset new file mode 100644 index 0000000..fed704a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:787c7b69a054c6f2850503c016a2ef2fade7ad0941375c8e521c3534bf695d12 +size 384793 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Left.uasset new file mode 100644 index 0000000..368ebf1 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a99d18722e504801616e1c0c495711c43c2d82c4465f7f388cdae8a45502bd1e +size 453120 diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Right.uasset new file mode 100644 index 0000000..588e44d --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c2c12d6a959d69c96962ca340bdfe984942df621ee2ff7e7e955662ddaee52a +size 510650 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset b/Content/Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset new file mode 100644 index 0000000..25722d3 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60ae8c970189979d9e070beb0fd8675f4afb2b04d8aaa8d11a0f03c5b7ebf4b2 +size 385911 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_01.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_01.uasset new file mode 100644 index 0000000..34b5970 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f796113f17c91eca7e48ef57bbadc4fc36245a86b127e75a34ca4771500639ed +size 757637 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_02.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_02.uasset new file mode 100644 index 0000000..a816bd9 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb3c74b8e32fb5a88c6d659cae8717294af85d4eaa7f684b2a36c36d245559dc +size 661409 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_03.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_03.uasset new file mode 100644 index 0000000..21473da --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c66016fc3bd386453ac7fb1229a5f0644c6bd5f98ead29f6e6a1be80632ba1f +size 1036132 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_ChargedAttack.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_ChargedAttack.uasset new file mode 100644 index 0000000..0928916 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_ChargedAttack.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d9b0fc6892519095cb6930aba5c0dd063acf647612a06e0f2f7e19c463223ee +size 1057890 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/BS_Idle_Walk_Run.uasset b/Content/Characters/Mannequins/Anims/Unarmed/BS_Idle_Walk_Run.uasset new file mode 100644 index 0000000..0971bcd --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/BS_Idle_Walk_Run.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc71af8768b569695d4bcb69c79867f998e085693f5e8230854d228de359f5bb +size 52333 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd.uasset new file mode 100644 index 0000000..5f9af37 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f6e9448f0e0737f506d9e8f11b8d661d6d65c818f0e3160938f1e24082b16c3 +size 483265 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Left.uasset new file mode 100644 index 0000000..9b073a0 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6e68e6cf4175f85c0e16a60f80335a1fab3f8c76a014d02bc0cd18aabe3314a +size 417528 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Right.uasset new file mode 100644 index 0000000..0dbf181 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee3137ff2b7d2cb721c935e2de91d55479e20f030ff230e9f912f6b70658c399 +size 417530 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd.uasset new file mode 100644 index 0000000..ed8291b --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ccbe851f85a6d4cd7c6438c219cb6af8e281784107b5be8e9b052e4df3069cb +size 531789 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Left.uasset new file mode 100644 index 0000000..2ea4836 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12ee5a11f277af90429980f120026f430ae1e438f6eae42c10222e175f9dbe12 +size 466995 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Right.uasset new file mode 100644 index 0000000..88e8f2a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66a7561d60453794864edd7e0c55487817068b6b66e31e179c98b9f2bab4c76b +size 467310 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Left.uasset new file mode 100644 index 0000000..5537bd3 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7842445f0c2b2f8d3cd9d43b9f58bc3ea888adeb1e161398b492097358431bd +size 487864 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Right.uasset new file mode 100644 index 0000000..95bd4d8 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208f642310d9627d12a5125889b480e051a1f1fc5397a10b83975903a0c59aea +size 521907 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Dash.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Dash.uasset new file mode 100644 index 0000000..ccda01e --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Dash.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a1c964403b7b1d9d9f5e0dd8c20c1ae809606c5e8021b2983edfc65ac0a66f0 +size 663135 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Fall_Loop.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Fall_Loop.uasset new file mode 100644 index 0000000..818db5b --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Fall_Loop.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:408be742c63adffe8c6c1d22442e99ea34a7618cd33c6e78e0eed3d7db877433 +size 925351 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Jump.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Jump.uasset new file mode 100644 index 0000000..f394c85 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Jump.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:252cbf69b07b797d3c3c6177d3ae9df17e9873f4872c4fa040c0d441dc3b3cef +size 403730 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Land.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Land.uasset new file mode 100644 index 0000000..3f2cff7 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Land.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a00de25a6beca56ff6d8077081531e5cef238c92825b6c184351d0aa99ef3fcb +size 410017 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_WallJump.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_WallJump.uasset new file mode 100644 index 0000000..9a3e3b0 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_WallJump.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e29af6dc13219cb813097e596c143d964a18c118caca138015574009e50859c0 +size 409179 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/MM_Idle.uasset b/Content/Characters/Mannequins/Anims/Unarmed/MM_Idle.uasset new file mode 100644 index 0000000..01f327a --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/MM_Idle.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11ee7fdeb84db89c1a66785b43b9bfc1415782122b8ac229517f4c5125d9cb0d +size 1436554 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd.uasset new file mode 100644 index 0000000..7a756d9 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae0c2ee1c1178fd1b9493f6c327e52d10a3d6bbde29eae54dcb07c13a27dcf46 +size 606821 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Left.uasset new file mode 100644 index 0000000..7039ba5 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c25a8eebb9883085ac8f82de3c83fc34fd19b02567f17fafde9dd60c09cf3e5 +size 537758 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Right.uasset new file mode 100644 index 0000000..a7a37ee --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c71b9bbf7b15d75cacddbeb8827e22888cfa63a359ecbc0e017aec822d1a522 +size 537632 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd.uasset new file mode 100644 index 0000000..176830c --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c74b2fc0cb651c4924804b364e534856a1b44dee818127c408dc055e4bda5ed9 +size 475783 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Left.uasset new file mode 100644 index 0000000..81e677c --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7d8ff5a55eb0c445da2c74b2fd9460b6a3aff0db206be9e99aed319158d5770 +size 411535 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Right.uasset new file mode 100644 index 0000000..4bc55f7 --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67d3d4fed066023a14220277f5598db83f19efee97de908b1397b0ae998e5599 +size 411529 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Left.uasset new file mode 100644 index 0000000..af992ac --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Left.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81500e4fcdd9ae9aa6433e652e67dea8f9dd9fa7b9ef1714e29f6ab0a1bb9d97 +size 486552 diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Right.uasset new file mode 100644 index 0000000..0b6929c --- /dev/null +++ b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Right.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5922b4e632351353224b32f719af97e85512ab4f6553b15315cf14ad04f675f +size 491934 diff --git a/Content/Characters/Mannequins/Materials/M_Mannequin.uasset b/Content/Characters/Mannequins/Materials/M_Mannequin.uasset new file mode 100644 index 0000000..98e1cc3 --- /dev/null +++ b/Content/Characters/Mannequins/Materials/M_Mannequin.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7ffe412d906380bd5bd4462f464b2a1fe48fdb79b9077f29bd0f958a782035c +size 59292 diff --git a/Content/Characters/Mannequins/Materials/Manny/MI_Manny_01_New.uasset b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_01_New.uasset new file mode 100644 index 0000000..f3bc1ee --- /dev/null +++ b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_01_New.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f1e4ed382304d020b750c81505140fc1de4d339b0909430adb5380a6bb89b65 +size 17963 diff --git a/Content/Characters/Mannequins/Materials/Manny/MI_Manny_02_New.uasset b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_02_New.uasset new file mode 100644 index 0000000..00588a3 --- /dev/null +++ b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_02_New.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26389db06f0b7928b487494bef3320d6b0e6bccd58193bccedd67c2c89132a46 +size 18706 diff --git a/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_01.uasset b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_01.uasset new file mode 100644 index 0000000..57741cd --- /dev/null +++ b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62a3050ef24b823f9fe84ac5d9c477099494982d35dafcc3d8078f32b0d4a865 +size 11184 diff --git a/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_02.uasset b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_02.uasset new file mode 100644 index 0000000..55c2250 --- /dev/null +++ b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6aec77489fdfab0e1ea299de60fbd4f332face4495bbbd20b97fb0308bb9c5b4 +size 10718 diff --git a/Content/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset b/Content/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset new file mode 100644 index 0000000..78ddac4 --- /dev/null +++ b/Content/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be9f011191ee1887b97cd13bce09886a6066c2fd62c619991070ec142184e1bf +size 15825101 diff --git a/Content/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset b/Content/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset new file mode 100644 index 0000000..1640eee --- /dev/null +++ b/Content/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ef45d92507a76d74a5e06737f94cad40eb7d5f5769dfbb63f7f74e784a178c6 +size 16252577 diff --git a/Content/Characters/Mannequins/Meshes/SK_Mannequin.uasset b/Content/Characters/Mannequins/Meshes/SK_Mannequin.uasset new file mode 100644 index 0000000..108bf57 --- /dev/null +++ b/Content/Characters/Mannequins/Meshes/SK_Mannequin.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22029d47455f24471195b26a0e04a1e1389f27d6a924e88c9f46a0f600c9a530 +size 191198 diff --git a/Content/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset new file mode 100644 index 0000000..bc7f74e --- /dev/null +++ b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57f84458a160c35b77f0442d2af41054e41e021ebbb496c2c76dea76d1d89580 +size 17057558 diff --git a/Content/Characters/Mannequins/Rigs/CR_Mannequin_FootIK.uasset b/Content/Characters/Mannequins/Rigs/CR_Mannequin_FootIK.uasset new file mode 100644 index 0000000..e525c8b --- /dev/null +++ b/Content/Characters/Mannequins/Rigs/CR_Mannequin_FootIK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa01be065d2efa2dfd3b258f60b94b09fcd5d351356d16bb52578ef5bcbfb5c5 +size 498698 diff --git a/Content/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset new file mode 100644 index 0000000..9a40625 --- /dev/null +++ b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:057818dd3e0e16ff90c147e25a8fc5ab309c49c4c60360477cf4742e767d151e +size 2575944 diff --git a/Content/Characters/Mannequins/Rigs/PA_Mannequin.uasset b/Content/Characters/Mannequins/Rigs/PA_Mannequin.uasset new file mode 100644 index 0000000..d4e8895 --- /dev/null +++ b/Content/Characters/Mannequins/Rigs/PA_Mannequin.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0ceaf003947088ff076555b81a46e5ccb11149c94025eb2a9e74263fbaa0d67 +size 301538 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset new file mode 100644 index 0000000..669e158 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f623209571ecbd8185b5b463786be033c3284190b4fc7b249e8d1d2ed995fd8 +size 1422785 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset new file mode 100644 index 0000000..f0f30b0 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ae0f4f9908c30ecc9aedf1ebb442e4983e526a7832ec791542064c7853f9999 +size 699555 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_MRA.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_MRA.uasset new file mode 100644 index 0000000..3772d29 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_MRA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e42e888aed8aefff68da7d7dda4f177c5647b19473e4e913f61375c1319abd8 +size 712594 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset new file mode 100644 index 0000000..18c8e6c --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9575d21c9e2872b3358c0efb9e202535ce2efce94c338b9d3bd04cb9831e353 +size 20999487 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset new file mode 100644 index 0000000..c1ce340 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:474728713232c6833f55c041548f555bc62c5c49e74082a5d16e68a5ce488cfe +size 1036712 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_MRA.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_MRA.uasset new file mode 100644 index 0000000..464be58 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_MRA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6697972eaf2dfe201923dba6a302f024b0ef4c4e46b4ecf578178717098e8277 +size 1059559 diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset new file mode 100644 index 0000000..e330d12 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61a9db73f72fe2d7d8821b33a79f57f3f11df9da9455822392b84b199c78e8df +size 1680197 diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_D.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_D.uasset new file mode 100644 index 0000000..dbb262e --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04e5ed207b7df0d2ad1bbc668916bcf170545fc2a72875e49ec99c6e2667002f +size 674768 diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_MRA.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_MRA.uasset new file mode 100644 index 0000000..6d87469 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_MRA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0988d4d9f25597224910e1043591cb2a089a8607a4fe4a63cbc68f3eb2ab473e +size 791597 diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_N.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_N.uasset new file mode 100644 index 0000000..6091030 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10fbe9ac3e18e0a890d19756d3470ca372a1aeaffefbe9a22d6b0e6182293551 +size 1263741 diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_D.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_D.uasset new file mode 100644 index 0000000..47a5414 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0ccb2f465894c6f9ff4dd142351ed33186c5f861283a75f3e08d1531a253c49 +size 943331 diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_MRA.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_MRA.uasset new file mode 100644 index 0000000..d7e4602 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_MRA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f7e495cbe0430aed7084b5508f87186f98346eb04f003734c9b378891da7887 +size 974099 diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_N.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_N.uasset new file mode 100644 index 0000000..8b00e73 --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bc26466e9fdc954cc276bb6ac1350e22c3dabbe1b54b6bf78ed5ae2e339d9fc +size 1524635 diff --git a/Content/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset b/Content/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset new file mode 100644 index 0000000..33f52cd --- /dev/null +++ b/Content/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34e6fa3414c04a86b7a5287e5569ea9d6e53c319d6e7dbfc8b09dab5b70611a6 +size 59927 diff --git a/Content/Input/Actions/IA_Jump.uasset b/Content/Input/Actions/IA_Jump.uasset new file mode 100644 index 0000000..ebc44ca --- /dev/null +++ b/Content/Input/Actions/IA_Jump.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73c14789fee45a6e1eff57f3304a0bafee23790cc8ea6a6a5bf0056e75d7b3e4 +size 1695 diff --git a/Content/Input/Actions/IA_Look.uasset b/Content/Input/Actions/IA_Look.uasset new file mode 100644 index 0000000..be55ec4 --- /dev/null +++ b/Content/Input/Actions/IA_Look.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d4a2cb59db11a0a080834e1b292207e530b8df217446afb46e382d9fa12f5a9 +size 1385 diff --git a/Content/Input/Actions/IA_MouseLook.uasset b/Content/Input/Actions/IA_MouseLook.uasset new file mode 100644 index 0000000..e3df2e1 --- /dev/null +++ b/Content/Input/Actions/IA_MouseLook.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2901132a04ceb384e2693107b8f5455de48b7c325d6cc5ce07556c6425c19f48 +size 1410 diff --git a/Content/Input/Actions/IA_Move.uasset b/Content/Input/Actions/IA_Move.uasset new file mode 100644 index 0000000..55c3d70 --- /dev/null +++ b/Content/Input/Actions/IA_Move.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85567b9d91ffd9f7106c3062557a6fa864a791233380353f63eb563470985add +size 1385 diff --git a/Content/Input/IMC_Default.uasset b/Content/Input/IMC_Default.uasset new file mode 100644 index 0000000..b63309a --- /dev/null +++ b/Content/Input/IMC_Default.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:133bda6567aaeea1aae05c03597345e4b1d9ef24d868a0275203b3203a7aae98 +size 7787 diff --git a/Content/Input/IMC_MouseLook.uasset b/Content/Input/IMC_MouseLook.uasset new file mode 100644 index 0000000..bb5126c --- /dev/null +++ b/Content/Input/IMC_MouseLook.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a00157cd520edcf0b037d7091bfe188fa6eb7c48465f695981f7cbe5fb4cc80 +size 2521 diff --git a/Content/Input/Touch/BPI_TouchInterface.uasset b/Content/Input/Touch/BPI_TouchInterface.uasset new file mode 100644 index 0000000..938c653 --- /dev/null +++ b/Content/Input/Touch/BPI_TouchInterface.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e778ae087305a34cd6957fcf9b29670f0a2a01be96bad89c79b83286496ec45f +size 16393 diff --git a/Content/Input/Touch/UI_Thumbstick.uasset b/Content/Input/Touch/UI_Thumbstick.uasset new file mode 100644 index 0000000..bdcaf58 --- /dev/null +++ b/Content/Input/Touch/UI_Thumbstick.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49c8c04b2e8c88beb55935b05d9af72c35d89512ea6435f20d5e3123be139f8b +size 223040 diff --git a/Content/Input/Touch/UI_TouchSimple.uasset b/Content/Input/Touch/UI_TouchSimple.uasset new file mode 100644 index 0000000..60a5dc0 --- /dev/null +++ b/Content/Input/Touch/UI_TouchSimple.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81f45f11e73180f0964ee3f59f77c8c55e61d355e5c69427e1de67e5aa5db77b +size 70301 diff --git a/Content/LevelPrototyping/Interactable/Door/BP_DoorFrame.uasset b/Content/LevelPrototyping/Interactable/Door/BP_DoorFrame.uasset new file mode 100644 index 0000000..038f9e8 --- /dev/null +++ b/Content/LevelPrototyping/Interactable/Door/BP_DoorFrame.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4386d7d71b8d5241fd8150aa47900711eb0d8bd069c00de25fce07f011d698fa +size 448616 diff --git a/Content/LevelPrototyping/Interactable/Door/Meshes/SM_Door.uasset b/Content/LevelPrototyping/Interactable/Door/Meshes/SM_Door.uasset new file mode 100644 index 0000000..244ff77 --- /dev/null +++ b/Content/LevelPrototyping/Interactable/Door/Meshes/SM_Door.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa98c4fc5083393e085d7b44d0b67a7e830922e2601a439167916616bbc29993 +size 59267 diff --git a/Content/LevelPrototyping/Interactable/Door/Meshes/SM_DoorFrame_Corner.uasset b/Content/LevelPrototyping/Interactable/Door/Meshes/SM_DoorFrame_Corner.uasset new file mode 100644 index 0000000..68fec6c --- /dev/null +++ b/Content/LevelPrototyping/Interactable/Door/Meshes/SM_DoorFrame_Corner.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:383dea9555e76303d60d0011fae6651a4be07c24033c0aceeecd137c954ee3fc +size 86885 diff --git a/Content/LevelPrototyping/Interactable/Door/Meshes/SM_DoorFrame_Edge.uasset b/Content/LevelPrototyping/Interactable/Door/Meshes/SM_DoorFrame_Edge.uasset new file mode 100644 index 0000000..e15c698 --- /dev/null +++ b/Content/LevelPrototyping/Interactable/Door/Meshes/SM_DoorFrame_Edge.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26eb76a2ce36be334bf0770561475a9e06be928e9ca75b4a31f5df3debb36592 +size 69088 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/MI_GlowNT.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/MI_GlowNT.uasset new file mode 100644 index 0000000..413555f --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/MI_GlowNT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fd40bc38bfea9418fa54fe365732a1219e615169542a0a4d2e1d518318c864b +size 4145 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_GradientGlow.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_GradientGlow.uasset new file mode 100644 index 0000000..ecf223d --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_GradientGlow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1b29ad29c2eac3dba6dd6a90aed9de8c6147a13b6288a42bd73fe14b78970a8 +size 17587 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_SimpleGlow.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_SimpleGlow.uasset new file mode 100644 index 0000000..203e88d --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_SimpleGlow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6098242541b34be6aba19ea1fbfa35107f891e8f55d30d4061aa11b065b8bd8 +size 15213 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.uasset new file mode 100644 index 0000000..76776ce --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97fbe3da2d907279dcbfbbf285e1b111ceb8d5f4a1c9d6bd48fcb8defc86842b +size 70608 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.uasset new file mode 100644 index 0000000..6cb18b2 --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ddb27bf7020f4980d3f8435cb0928fb48b32c1ab3ea24bac7e253435081bf6b +size 71705 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/NS_JumpPad.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/NS_JumpPad.uasset new file mode 100644 index 0000000..7510742 --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/Assets/NS_JumpPad.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e76849cbb139160e5e73c226fe6aaa66a63fbf75cbd1213f871cca65e409817 +size 795908 diff --git a/Content/LevelPrototyping/Interactable/JumpPad/BP_JumpPad.uasset b/Content/LevelPrototyping/Interactable/JumpPad/BP_JumpPad.uasset new file mode 100644 index 0000000..ff56bc2 --- /dev/null +++ b/Content/LevelPrototyping/Interactable/JumpPad/BP_JumpPad.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42ba8262f07355cdf36e33977f3bb415810390cf210b75573d766bd819cf8401 +size 92487 diff --git a/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.uasset b/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.uasset new file mode 100644 index 0000000..a8140cd --- /dev/null +++ b/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:378ace355b8f5e71a12e459d9f8cf4958626884142fec34be8630db6d8412cad +size 283425 diff --git a/Content/LevelPrototyping/Interactable/Target/BP_WobbleTarget.uasset b/Content/LevelPrototyping/Interactable/Target/BP_WobbleTarget.uasset new file mode 100644 index 0000000..8f7dc3b --- /dev/null +++ b/Content/LevelPrototyping/Interactable/Target/BP_WobbleTarget.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bd8784bf03cb945d63deb2c4c22261a9a9ea2af1f84766805ca92ec7b521ab3 +size 45551 diff --git a/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset b/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset new file mode 100644 index 0000000..d998cb3 --- /dev/null +++ b/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ee13abdb241d9811f6c1bcc0a607d229fa7adc5f46bfd5a9d5fedbfa279683 +size 49820 diff --git a/Content/LevelPrototyping/Materials/MI_DefaultColorway.uasset b/Content/LevelPrototyping/Materials/MI_DefaultColorway.uasset new file mode 100644 index 0000000..cc18613 --- /dev/null +++ b/Content/LevelPrototyping/Materials/MI_DefaultColorway.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:786a4dfcaaa6f4daf459c77bda247c2c138140680a8246d521974d0cc4fc8a8e +size 9260 diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset new file mode 100644 index 0000000..d844901 --- /dev/null +++ b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:084681bf680dad66b8c8ca803d927053cf46756f2f2e62d18fcc439e07de7263 +size 13121 diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset new file mode 100644 index 0000000..d727d35 --- /dev/null +++ b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa0f2a06a7d937127d7d737c13bacb3f8fe88c8e0479f5e6b7cda81fd225d077 +size 11922 diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_Round.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_Round.uasset new file mode 100644 index 0000000..4778f66 --- /dev/null +++ b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_Round.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:901ec868e81e7a73c9f3ad4814e1205af27abc772949e5a30550a00f31ce4437 +size 11413 diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset new file mode 100644 index 0000000..1eae7f9 --- /dev/null +++ b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:838034e5afc7ab3a70bfff6de2e1237aa02337fb423e95c1b536b3e30c61c982 +size 11957 diff --git a/Content/LevelPrototyping/Materials/M_FlatCol.uasset b/Content/LevelPrototyping/Materials/M_FlatCol.uasset new file mode 100644 index 0000000..0be45d4 --- /dev/null +++ b/Content/LevelPrototyping/Materials/M_FlatCol.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41dbbda4b463a224c29ee01765e1f52a8ae63f2f94f1440ee267fe7b1a481585 +size 11771 diff --git a/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset b/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset new file mode 100644 index 0000000..73c3bcf --- /dev/null +++ b/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf8625ad5917cee705867038d8a590b25465e6b5d5818a738a584e515d7cbdfc +size 79863 diff --git a/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset b/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset new file mode 100644 index 0000000..dcc10b1 --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b20a3ae9668ec599db519af3f84b67952d0e31ac4427b80ee812232edde91f53 +size 128849 diff --git a/Content/LevelPrototyping/Meshes/SM_Cube.uasset b/Content/LevelPrototyping/Meshes/SM_Cube.uasset new file mode 100644 index 0000000..fcb2e03 --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_Cube.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4680317a8c87f983e077f6c0a6b93ffaa0ba4dbddbc810960d4553e6ad380a89 +size 18279 diff --git a/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset b/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset new file mode 100644 index 0000000..ffaea18 --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76aaa3c2b812ff790fb57ae7736b748e4e1556afbb13466fd787d4bacd2c7dfe +size 193636 diff --git a/Content/LevelPrototyping/Meshes/SM_Plane.uasset b/Content/LevelPrototyping/Meshes/SM_Plane.uasset new file mode 100644 index 0000000..8a6e0cd --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_Plane.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39ab83dc57a9a27a80476711610f72e81c0685a05d4aa95413b3e4e7f6c4a3f2 +size 15581 diff --git a/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset b/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset new file mode 100644 index 0000000..e3e30cc --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4087b3f85753d9ccbced7d00d42208dad4d21185f24a97b0c86db31be867b733 +size 135087 diff --git a/Content/LevelPrototyping/Meshes/SM_QuarterCylinderOuter.uasset b/Content/LevelPrototyping/Meshes/SM_QuarterCylinderOuter.uasset new file mode 100644 index 0000000..108131a --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_QuarterCylinderOuter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab58a5224da57452f367c9d55ea4976466138fc2cb8ec9e2fa92748c86a07f11 +size 79741 diff --git a/Content/LevelPrototyping/Meshes/SM_Ramp.uasset b/Content/LevelPrototyping/Meshes/SM_Ramp.uasset new file mode 100644 index 0000000..d176359 --- /dev/null +++ b/Content/LevelPrototyping/Meshes/SM_Ramp.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5b472deb37a9956b9112dccee3d09498a456baeacc574db8c5d725463b73597 +size 18690 diff --git a/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset b/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset new file mode 100644 index 0000000..37cf466 --- /dev/null +++ b/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb8334767064b107ec4f4407ef1365e8b9e2dfeff5984e66d4a6232254ddd02a +size 9600 diff --git a/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset b/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset new file mode 100644 index 0000000..c299638 --- /dev/null +++ b/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45e6eca3e0e2af0b2fdb9780db8ebfc24f63eac6c5d8721e82814722c81e63ed +size 54802 diff --git a/Content/ThirdPerson/Blueprints/BP_ThirdPersonGameMode.uasset b/Content/ThirdPerson/Blueprints/BP_ThirdPersonGameMode.uasset new file mode 100644 index 0000000..0779329 --- /dev/null +++ b/Content/ThirdPerson/Blueprints/BP_ThirdPersonGameMode.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3520d665f8c2fbb8ea3d3868dbdf268e6a88b342ffe6bfbafb7177f9e172e74c +size 21794 diff --git a/Content/ThirdPerson/Blueprints/BP_ThirdPersonPlayerController.uasset b/Content/ThirdPerson/Blueprints/BP_ThirdPersonPlayerController.uasset new file mode 100644 index 0000000..a99a90f --- /dev/null +++ b/Content/ThirdPerson/Blueprints/BP_ThirdPersonPlayerController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a68229ef07d29a92a453b475cb28bbe6001883f163014ba10512959d2d71d0c5 +size 21713 diff --git a/Content/ThirdPerson/Lvl_ThirdPerson.umap b/Content/ThirdPerson/Lvl_ThirdPerson.umap new file mode 100644 index 0000000..8e3863f --- /dev/null +++ b/Content/ThirdPerson/Lvl_ThirdPerson.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e668a9b3098a76f49ce307759ab00662406c7fa0870eeee6e7a2dbf7f854386 +size 12330 diff --git a/Content/ThirdPerson/MI_ThirdPersonColWay.uasset b/Content/ThirdPerson/MI_ThirdPersonColWay.uasset new file mode 100644 index 0000000..33ab0e4 --- /dev/null +++ b/Content/ThirdPerson/MI_ThirdPersonColWay.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa8b4a4115c11750c57dc94df7fb8ab3c7f0cfef71037b9d11e7639fab15c25e +size 9301 diff --git a/Content/Variant_Combat/Anims/ABP_Manny_Combat.uasset b/Content/Variant_Combat/Anims/ABP_Manny_Combat.uasset new file mode 100644 index 0000000..9080128 --- /dev/null +++ b/Content/Variant_Combat/Anims/ABP_Manny_Combat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a57dd0385d2fe9fac3d8dde2baaeab04d66734176c4ce83bf9fce86e055d175 +size 396972 diff --git a/Content/Variant_Combat/Anims/AM_ChargedAttack.uasset b/Content/Variant_Combat/Anims/AM_ChargedAttack.uasset new file mode 100644 index 0000000..44cdffe --- /dev/null +++ b/Content/Variant_Combat/Anims/AM_ChargedAttack.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d5459828534149aaa9493aa82e9185dc2de52c840c02c56493e193bbe10c2da +size 15766 diff --git a/Content/Variant_Combat/Anims/AM_ComboAttack.uasset b/Content/Variant_Combat/Anims/AM_ComboAttack.uasset new file mode 100644 index 0000000..58eacad --- /dev/null +++ b/Content/Variant_Combat/Anims/AM_ComboAttack.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f1a9b1308e320ea01da94b4b283d42518883888c5ad3857e397cc6194d61413 +size 19674 diff --git a/Content/Variant_Combat/Blueprints/AI/BP_CombatAIController.uasset b/Content/Variant_Combat/Blueprints/AI/BP_CombatAIController.uasset new file mode 100644 index 0000000..3b2dccd --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/BP_CombatAIController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28afb5c9d6fe3a946a380fb899190900b640d8dc78750b01d643d6d5a61094ab +size 21685 diff --git a/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemy.uasset b/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemy.uasset new file mode 100644 index 0000000..4657478 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b57834a94b0cfbb7d9a6b3ea5dff05520e100075dfde718efa4b96bfc4653cb9 +size 48517 diff --git a/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemySpawner.uasset b/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemySpawner.uasset new file mode 100644 index 0000000..f5f8998 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/BP_CombatEnemySpawner.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13a6841ad902f12a3e9666aeeb3a2fb8ade8cd8f24de7f90ff5bcb1244a115e5 +size 30455 diff --git a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Evade.uasset b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Evade.uasset new file mode 100644 index 0000000..c70c8d5 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Evade.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78de75a68bbb22623c8fbadc1f7b2b84b53d3f7038729ad99df67437c15b2a2d +size 24518 diff --git a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Fallback.uasset b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Fallback.uasset new file mode 100644 index 0000000..01fdccc --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Fallback.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8235e6a21d527fdfcdeeede8d7c791cc7ff3aa553b557d612ed00a30f3306a2b +size 19265 diff --git a/Content/Variant_Combat/Blueprints/AI/EnvQuery_Flank.uasset b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Flank.uasset new file mode 100644 index 0000000..1bb8207 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/EnvQuery_Flank.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7817fbc8f5c04879dde0757848d712b21a79d6a4ee933b96d6c4faf1487cd6da +size 15601 diff --git a/Content/Variant_Combat/Blueprints/AI/ST_CombatEnemy.uasset b/Content/Variant_Combat/Blueprints/AI/ST_CombatEnemy.uasset new file mode 100644 index 0000000..3c948d7 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/AI/ST_CombatEnemy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a3258956813ad9d660b226eab04b3caa57e67c9b941b565acb01e0fa5834f3b +size 408179 diff --git a/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Enemy.uasset b/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Enemy.uasset new file mode 100644 index 0000000..a762890 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Enemy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fba3dfe25795d0945e325edec6af84108b6fa163560edf6faded1580118609d5 +size 6203 diff --git a/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Player.uasset b/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Player.uasset new file mode 100644 index 0000000..44a5b4d --- /dev/null +++ b/Content/Variant_Combat/Blueprints/BP_CameraShake_Hit_Player.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b39584c179bdc5a500e48423f6326b1a12ad82f39faab352cf874acbf375bb4 +size 6667 diff --git a/Content/Variant_Combat/Blueprints/BP_CombatCharacter.uasset b/Content/Variant_Combat/Blueprints/BP_CombatCharacter.uasset new file mode 100644 index 0000000..6d2e927 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/BP_CombatCharacter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5a87e4af69d19eb1d82157db094f5998041180fca8d745f636d710f75214a7d +size 148043 diff --git a/Content/Variant_Combat/Blueprints/BP_CombatGameMode.uasset b/Content/Variant_Combat/Blueprints/BP_CombatGameMode.uasset new file mode 100644 index 0000000..ecb9b11 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/BP_CombatGameMode.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:233d61e9908bf8ea11f02015ff349de2702c6f0570cd67baad527d0dd4a80350 +size 21919 diff --git a/Content/Variant_Combat/Blueprints/BP_CombatPlayerController.uasset b/Content/Variant_Combat/Blueprints/BP_CombatPlayerController.uasset new file mode 100644 index 0000000..379dd20 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/BP_CombatPlayerController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edb83373fb50db733616c427fd0069c78a9042ab92ba689b0b2259ad72c49d29 +size 21815 diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatActivationVolume.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatActivationVolume.uasset new file mode 100644 index 0000000..2c070cc --- /dev/null +++ b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatActivationVolume.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9784ed5c7db2c5dfa76dd25e272474a7e3c96706152c33f8771db66923a34eed +size 23202 diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatCheckpointVolume.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatCheckpointVolume.uasset new file mode 100644 index 0000000..73b04fb --- /dev/null +++ b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatCheckpointVolume.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e61c8a1ac8c0e7ded33535e3fa1e61d523f66fe734acb010d046e6977c94a3a +size 23202 diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDamageableBox.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDamageableBox.uasset new file mode 100644 index 0000000..5ae1155 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDamageableBox.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1c5efc611c2e8a3422c84b44136e26b58fa2d567d60d572d56199f968247a48 +size 78930 diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDummy.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDummy.uasset new file mode 100644 index 0000000..3c11674 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatDummy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e28b487bd85f9d81b868a3e0b9095633b77c89d1319bc2e3b8810fbf3d1ea4d +size 44300 diff --git a/Content/Variant_Combat/Blueprints/Interactables/BP_CombatLavaFloor.uasset b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatLavaFloor.uasset new file mode 100644 index 0000000..a702436 --- /dev/null +++ b/Content/Variant_Combat/Blueprints/Interactables/BP_CombatLavaFloor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75565292a8ef25b551691b7203b0bbd2874105516b16eb73ba78e3b0f4f04577 +size 32552 diff --git a/Content/Variant_Combat/Input/Actions/IA_ChargedAttack.uasset b/Content/Variant_Combat/Input/Actions/IA_ChargedAttack.uasset new file mode 100644 index 0000000..5dc45ab --- /dev/null +++ b/Content/Variant_Combat/Input/Actions/IA_ChargedAttack.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1414316d3bc32a3e854af9dd94d02b24a2719069e64ea8c7657c238c68e4bf17 +size 1770 diff --git a/Content/Variant_Combat/Input/Actions/IA_ComboAttack.uasset b/Content/Variant_Combat/Input/Actions/IA_ComboAttack.uasset new file mode 100644 index 0000000..4bd4609 --- /dev/null +++ b/Content/Variant_Combat/Input/Actions/IA_ComboAttack.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e61d59be7c1da08c56dffcb76bf85dcad926f370b164049cfaa9c5f8eadeba0a +size 1760 diff --git a/Content/Variant_Combat/Input/Actions/IA_ToggleCameraSide.uasset b/Content/Variant_Combat/Input/Actions/IA_ToggleCameraSide.uasset new file mode 100644 index 0000000..deb0125 --- /dev/null +++ b/Content/Variant_Combat/Input/Actions/IA_ToggleCameraSide.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:639f930516a9ad1db39e4b20c889ddc8c521551abd7a14161b05204227869dd2 +size 1536 diff --git a/Content/Variant_Combat/Input/BPI_TouchInterface_Combat.uasset b/Content/Variant_Combat/Input/BPI_TouchInterface_Combat.uasset new file mode 100644 index 0000000..f6b8355 --- /dev/null +++ b/Content/Variant_Combat/Input/BPI_TouchInterface_Combat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ca75784382c680dcc4abe086b3b01cb2f7ad4e9e721a14d3d1648d02bb661bf +size 23028 diff --git a/Content/Variant_Combat/Input/IMC_Combat.uasset b/Content/Variant_Combat/Input/IMC_Combat.uasset new file mode 100644 index 0000000..3d6e570 --- /dev/null +++ b/Content/Variant_Combat/Input/IMC_Combat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70a0550dafdf7c6a61935610eefcd83c1fa7475bd229ace5de6e695f315aa783 +size 9665 diff --git a/Content/Variant_Combat/Input/UI_TouchInterface_Combat.uasset b/Content/Variant_Combat/Input/UI_TouchInterface_Combat.uasset new file mode 100644 index 0000000..ff3dfd6 --- /dev/null +++ b/Content/Variant_Combat/Input/UI_TouchInterface_Combat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21b3db78f64d627de0264a718225840166737ec31faa713430924006ead28476 +size 97672 diff --git a/Content/Variant_Combat/Lvl_Combat.umap b/Content/Variant_Combat/Lvl_Combat.umap new file mode 100644 index 0000000..be29c2e --- /dev/null +++ b/Content/Variant_Combat/Lvl_Combat.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c2546c05f6d1d0f3ff75c9119317084074d68681022ec8aaf4f20656440de0b +size 12258 diff --git a/Content/Variant_Combat/Materials/MI_Box_Destroyed.uasset b/Content/Variant_Combat/Materials/MI_Box_Destroyed.uasset new file mode 100644 index 0000000..9c3251a --- /dev/null +++ b/Content/Variant_Combat/Materials/MI_Box_Destroyed.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ec5df3c39ad5e3425149170f2283a0695129fa0693fc055ddc5bf7e7477ad2f +size 9051 diff --git a/Content/Variant_Combat/Materials/M_Lava.uasset b/Content/Variant_Combat/Materials/M_Lava.uasset new file mode 100644 index 0000000..c38baa3 --- /dev/null +++ b/Content/Variant_Combat/Materials/M_Lava.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9ccf6e3d16c46bff01f0092edb5cb8e6aae2a81fcbcd802436de8ea55f4159a +size 18663 diff --git a/Content/Variant_Combat/UI/UI_LifeBar.uasset b/Content/Variant_Combat/UI/UI_LifeBar.uasset new file mode 100644 index 0000000..3c6e6f1 --- /dev/null +++ b/Content/Variant_Combat/UI/UI_LifeBar.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c48673b55d27b6507c70c0ac4cff49b638b8a35152622b6f4a76f220ad2d847b +size 39105 diff --git a/Content/Variant_Combat/VFX/NS_Damage.uasset b/Content/Variant_Combat/VFX/NS_Damage.uasset new file mode 100644 index 0000000..5a64c3b --- /dev/null +++ b/Content/Variant_Combat/VFX/NS_Damage.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bc328e285015e434bd18816f8d42b816d49d160a01aa486fa2d689b76737a3c +size 143620 diff --git a/Content/Variant_Platforming/Anims/ABP_Manny_Platforming.uasset b/Content/Variant_Platforming/Anims/ABP_Manny_Platforming.uasset new file mode 100644 index 0000000..54f66d1 --- /dev/null +++ b/Content/Variant_Platforming/Anims/ABP_Manny_Platforming.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1760838d6900022e6ae7b2437ee69f8cf050a0e2a38d79fc757aac93b3a292bb +size 504077 diff --git a/Content/Variant_Platforming/Anims/AM_Dash.uasset b/Content/Variant_Platforming/Anims/AM_Dash.uasset new file mode 100644 index 0000000..84c9afc --- /dev/null +++ b/Content/Variant_Platforming/Anims/AM_Dash.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10eb297b1a2e8803bec502b06838b077d716357f214c5c9ed40a212116986e2c +size 13375 diff --git a/Content/Variant_Platforming/Blueprints/BP_PlatformingCharacter.uasset b/Content/Variant_Platforming/Blueprints/BP_PlatformingCharacter.uasset new file mode 100644 index 0000000..931c0cc --- /dev/null +++ b/Content/Variant_Platforming/Blueprints/BP_PlatformingCharacter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ccb5f41a42151cfa49673c1caaf7f8814f9106c9ee27fb50c8b724523cb8892 +size 98210 diff --git a/Content/Variant_Platforming/Blueprints/BP_PlatformingGameMode.uasset b/Content/Variant_Platforming/Blueprints/BP_PlatformingGameMode.uasset new file mode 100644 index 0000000..dcc0227 --- /dev/null +++ b/Content/Variant_Platforming/Blueprints/BP_PlatformingGameMode.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76a3e5a3163d461ba6ddb2a4c239706a44effe8402e708c935f7fa3aaed208ab +size 22130 diff --git a/Content/Variant_Platforming/Blueprints/BP_PlatformingPlayerController.uasset b/Content/Variant_Platforming/Blueprints/BP_PlatformingPlayerController.uasset new file mode 100644 index 0000000..24b89e6 --- /dev/null +++ b/Content/Variant_Platforming/Blueprints/BP_PlatformingPlayerController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a14a2c3ed76836a22cceebf96b5ff59f12495c9a3aeaff8b976dcacb19a109b3 +size 22056 diff --git a/Content/Variant_Platforming/Input/Actions/IA_Dash.uasset b/Content/Variant_Platforming/Input/Actions/IA_Dash.uasset new file mode 100644 index 0000000..0424bfb --- /dev/null +++ b/Content/Variant_Platforming/Input/Actions/IA_Dash.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:662def2bc4e7edfcf4c0673d91b5f41adfe5c2cf70cb5c8f847f832b572ceed0 +size 1735 diff --git a/Content/Variant_Platforming/Input/BPI_TouchInterface_Platforming.uasset b/Content/Variant_Platforming/Input/BPI_TouchInterface_Platforming.uasset new file mode 100644 index 0000000..3b60518 --- /dev/null +++ b/Content/Variant_Platforming/Input/BPI_TouchInterface_Platforming.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f26c13fc00c12e517ca3cc7ddf54536c686e9ce5898534756d77d92a9f7a2e6e +size 18557 diff --git a/Content/Variant_Platforming/Input/IMC_Platforming.uasset b/Content/Variant_Platforming/Input/IMC_Platforming.uasset new file mode 100644 index 0000000..fa622cc --- /dev/null +++ b/Content/Variant_Platforming/Input/IMC_Platforming.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e94f067f538d5fa01cb69b030159537812dbd14e13ff6c4e31c570b834580414 +size 8779 diff --git a/Content/Variant_Platforming/Input/UI_TouchInterface_Platforming.uasset b/Content/Variant_Platforming/Input/UI_TouchInterface_Platforming.uasset new file mode 100644 index 0000000..23d4001 --- /dev/null +++ b/Content/Variant_Platforming/Input/UI_TouchInterface_Platforming.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71e8993c377fbe62e8edad4ee05811bec7f55064ece12d7bd8fc777f39852013 +size 87501 diff --git a/Content/Variant_Platforming/Lvl_Platforming.umap b/Content/Variant_Platforming/Lvl_Platforming.umap new file mode 100644 index 0000000..83c9ca5 --- /dev/null +++ b/Content/Variant_Platforming/Lvl_Platforming.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:972adf6fb2d4e363bd388154b9d81ede41d2c7d95d46ce1892dbfceb2eedadb4 +size 12230 diff --git a/Content/Variant_Platforming/VFX/NS_Jump_Trail.uasset b/Content/Variant_Platforming/VFX/NS_Jump_Trail.uasset new file mode 100644 index 0000000..ca7a177 --- /dev/null +++ b/Content/Variant_Platforming/VFX/NS_Jump_Trail.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3f5deb297d957c309998ca59d7b20b4eefeec49cb5ee83726f23c0cb95ed920 +size 233013 diff --git a/Content/Variant_SideScrolling/Anims/ABP_Manny_SideScroller.uasset b/Content/Variant_SideScrolling/Anims/ABP_Manny_SideScroller.uasset new file mode 100644 index 0000000..57d9724 --- /dev/null +++ b/Content/Variant_SideScrolling/Anims/ABP_Manny_SideScroller.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b65c78083edc9907a8649cd9e8574aafcdc65af0c0fbbe52cbd8dec279233fc +size 481647 diff --git a/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingAIController.uasset b/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingAIController.uasset new file mode 100644 index 0000000..2380691 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingAIController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62212e38b180fcab7ebf64943a83b29d11e5ed79f6afcc4d2d2e953061530d43 +size 22222 diff --git a/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingNPC.uasset b/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingNPC.uasset new file mode 100644 index 0000000..1c4b508 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/AI/BP_SideScrollingNPC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:591c06182f2a24cc14b4185e6719121299176f0f21284604f72282b57f32f670 +size 32522 diff --git a/Content/Variant_SideScrolling/Blueprints/AI/ST_SideScrollingNPC.uasset b/Content/Variant_SideScrolling/Blueprints/AI/ST_SideScrollingNPC.uasset new file mode 100644 index 0000000..fbdf383 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/AI/ST_SideScrollingNPC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77dccc188c7d44e0d6002452480c40fef9941f83391d11d3339f364e4a76498d +size 74594 diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCameraManager.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCameraManager.uasset new file mode 100644 index 0000000..e3e15ca --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCameraManager.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00492019b8f04b46bec7545699f6c6895ead470438914182ea0ca3561ff7e407 +size 24605 diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCharacter.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCharacter.uasset new file mode 100644 index 0000000..bc70002 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingCharacter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4a8406b99b5e4945f37d6baf6f22d3d2ae087b6a57016e6570b865aec48fcfd +size 61322 diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingGameMode.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingGameMode.uasset new file mode 100644 index 0000000..7f6e4f1 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingGameMode.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:598b6e60c4d5a8945f6f2891b0a6bc4fc68177bf89e7002ddc60fdb0fea04b18 +size 22213 diff --git a/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingPlayerController.uasset b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingPlayerController.uasset new file mode 100644 index 0000000..fe3152d --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/BP_SideScrollingPlayerController.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e75c0cac2910c794b8dbb244428d99791e25e53933c208122383da12e07f075 +size 22192 diff --git a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingMovingPlatform.uasset b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingMovingPlatform.uasset new file mode 100644 index 0000000..b5f84a5 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingMovingPlatform.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ba7d157a4f6ad8ee0fb7148cb73c77605e81bef2601e76f8c7632d65a0565a7 +size 68777 diff --git a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingPickup.uasset b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingPickup.uasset new file mode 100644 index 0000000..b59b641 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingPickup.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c105c72bd4bbf133c1653216672472f9fb3523d557e0918a2f612f525a6118b +size 46257 diff --git a/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingSoftPlatform.uasset b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingSoftPlatform.uasset new file mode 100644 index 0000000..61efd12 --- /dev/null +++ b/Content/Variant_SideScrolling/Blueprints/Items/BP_SideScrollingSoftPlatform.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bbfd766967e29787f410a872d495adedf37df45c9b3c864cf81d4d5676dfb01 +size 34588 diff --git a/Content/Variant_SideScrolling/Input/Actions/IA_Drop.uasset b/Content/Variant_SideScrolling/Input/Actions/IA_Drop.uasset new file mode 100644 index 0000000..850f94a --- /dev/null +++ b/Content/Variant_SideScrolling/Input/Actions/IA_Drop.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ec64991a715d2a363262eb013ff1548c308855cafa98f798f66fe8edc2e9e50 +size 1869 diff --git a/Content/Variant_SideScrolling/Input/Actions/IA_Interact.uasset b/Content/Variant_SideScrolling/Input/Actions/IA_Interact.uasset new file mode 100644 index 0000000..d9acca7 --- /dev/null +++ b/Content/Variant_SideScrolling/Input/Actions/IA_Interact.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffebc2e489fea2a5c6da96bf7abfa618a750da6f0185415ab51695dfee849fe3 +size 1757 diff --git a/Content/Variant_SideScrolling/Input/Actions/IA_Mover.uasset b/Content/Variant_SideScrolling/Input/Actions/IA_Mover.uasset new file mode 100644 index 0000000..e843b8f --- /dev/null +++ b/Content/Variant_SideScrolling/Input/Actions/IA_Mover.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b295c6f59757b5245e181b802b945a8209398585053e28398a49e28f9ba72c73 +size 1432 diff --git a/Content/Variant_SideScrolling/Input/BPI_TouchInterface_SideScrolling.uasset b/Content/Variant_SideScrolling/Input/BPI_TouchInterface_SideScrolling.uasset new file mode 100644 index 0000000..56a6bf1 --- /dev/null +++ b/Content/Variant_SideScrolling/Input/BPI_TouchInterface_SideScrolling.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:012a9ab33920d6b7d97889e699da91eb9c1e34ed73be56861c101c1b40bad666 +size 17079 diff --git a/Content/Variant_SideScrolling/Input/IMC_SideScroller.uasset b/Content/Variant_SideScrolling/Input/IMC_SideScroller.uasset new file mode 100644 index 0000000..2ea6a48 --- /dev/null +++ b/Content/Variant_SideScrolling/Input/IMC_SideScroller.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ac23fc0b6ffc89b09210fc2774db51d54de23e07018b86b8c32cd6f10eee549 +size 7181 diff --git a/Content/Variant_SideScrolling/Input/UI_TouchInterface_SideScrolling.uasset b/Content/Variant_SideScrolling/Input/UI_TouchInterface_SideScrolling.uasset new file mode 100644 index 0000000..98e6f53 --- /dev/null +++ b/Content/Variant_SideScrolling/Input/UI_TouchInterface_SideScrolling.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9c0c3c8a48d9c40aefe5d3562c74a7fe6c9504a4b44c64213b4010f425a3a07 +size 79161 diff --git a/Content/Variant_SideScrolling/Lvl_SideScrolling.umap b/Content/Variant_SideScrolling/Lvl_SideScrolling.umap new file mode 100644 index 0000000..d5d25a3 --- /dev/null +++ b/Content/Variant_SideScrolling/Lvl_SideScrolling.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:044801a99fcb7b52f4f66e2c007074bb026f25ff25fbfe675bfbc6d5dca714ce +size 12313 diff --git a/Content/Variant_SideScrolling/UI/UI_SideScrolling.uasset b/Content/Variant_SideScrolling/UI/UI_SideScrolling.uasset new file mode 100644 index 0000000..ed274c2 --- /dev/null +++ b/Content/Variant_SideScrolling/UI/UI_SideScrolling.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:477fffe50c64969a1da61fe63987728b00cea8d8fca67e59ad92565e50c1223e +size 39988 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/0/9R/UKIMD8EYGPZFS8OC6GX24A.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/0/9R/UKIMD8EYGPZFS8OC6GX24A.uasset new file mode 100644 index 0000000..28c16b6 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/0/9R/UKIMD8EYGPZFS8OC6GX24A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcc1060527c489fb8e33b8a3752fc86d65f7d3cdb9c4bbb044dfefccad6b124d +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/EU/X5MT1GOX9C5UUGZAKRVC3R.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/EU/X5MT1GOX9C5UUGZAKRVC3R.uasset new file mode 100644 index 0000000..a2f1db7 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/EU/X5MT1GOX9C5UUGZAKRVC3R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50d947877d507c95b765d9b3a3abab19739d6d0f41e6c7fa35a67e223d189023 +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/K3/79QZQ7KG2RXNWMD6RSPKUM.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/K3/79QZQ7KG2RXNWMD6RSPKUM.uasset new file mode 100644 index 0000000..0856010 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/K3/79QZQ7KG2RXNWMD6RSPKUM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6c82f9d1fc5f5cbfc3e0ff029862e718a80cd9ff9f59e0c495f873f8d815219 +size 4371 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/KL/UYSRPQ5SOYIFVLEQINPH31.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/KL/UYSRPQ5SOYIFVLEQINPH31.uasset new file mode 100644 index 0000000..129c6b5 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/KL/UYSRPQ5SOYIFVLEQINPH31.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67e1837f62649ac749d1ba75c4431602110aef8a648a4eb5b84f5f5490832d7c +size 4569 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/MV/2U2IE6JXO1320Q32RJQKSE.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/MV/2U2IE6JXO1320Q32RJQKSE.uasset new file mode 100644 index 0000000..a383691 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/MV/2U2IE6JXO1320Q32RJQKSE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0517da9397218cf46cf5db73305b412848d3325b302ac11c4ecda325e6da6a92 +size 4727 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/X5/JDOWWCJ7DZVSHT4Y29GQ4D.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/X5/JDOWWCJ7DZVSHT4Y29GQ4D.uasset new file mode 100644 index 0000000..45491fa --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/1/X5/JDOWWCJ7DZVSHT4Y29GQ4D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0041dd5c5f354e58fe0d681490fad5162013ced33e4856a33f86cb3daa0789f5 +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/AM/9YGDW7FMEY1CZD31VUYO11.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/AM/9YGDW7FMEY1CZD31VUYO11.uasset new file mode 100644 index 0000000..efa92cf --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/AM/9YGDW7FMEY1CZD31VUYO11.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4228732dd1d3826717b668980a23af543daec697e6b469ad9d0f88aa246324f4 +size 5271 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/AX/QEPSHOMS1K2ANUR3LXWOJM.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/AX/QEPSHOMS1K2ANUR3LXWOJM.uasset new file mode 100644 index 0000000..e949671 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/AX/QEPSHOMS1K2ANUR3LXWOJM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4602c5ff270ae3f56633b28275fd4430e9853d8b6d1c1b30f801b55db7df43ef +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/TV/DYUIEBPX2N8UFXT326WX2O.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/TV/DYUIEBPX2N8UFXT326WX2O.uasset new file mode 100644 index 0000000..a1b982d --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/TV/DYUIEBPX2N8UFXT326WX2O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5d9e958280ea231d5f413eae02e1d00448f9e979c2715bbee865ba6adf2094b +size 4721 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/V0/9XTUAMN5S6UUCFB5K0ZGZM.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/V0/9XTUAMN5S6UUCFB5K0ZGZM.uasset new file mode 100644 index 0000000..3c0c590 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/2/V0/9XTUAMN5S6UUCFB5K0ZGZM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0740b3c48e2a86ae0e6b8f2a57128b55d9a9150d3020c4cdd451edb69cd9bcd7 +size 4667 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/0N/NTRPN55OWWUSD03K29ZOSH.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/0N/NTRPN55OWWUSD03K29ZOSH.uasset new file mode 100644 index 0000000..f896845 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/0N/NTRPN55OWWUSD03K29ZOSH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7582c3a747bc6768a187ec5d99e000dc7aeb944b0cd0dfe73c203b17e5d84e5f +size 3982 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/C5/3LNK9WKCBL4YVMWIBXQZ1I.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/C5/3LNK9WKCBL4YVMWIBXQZ1I.uasset new file mode 100644 index 0000000..8a1f223 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/C5/3LNK9WKCBL4YVMWIBXQZ1I.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bad12184219cf6228a6c12dde934b3acd8bdf54ef2c3efd55629097907a9092d +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/D3/XWEMBL7KZTNQP83W1KTMXE.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/D3/XWEMBL7KZTNQP83W1KTMXE.uasset new file mode 100644 index 0000000..92108c1 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/D3/XWEMBL7KZTNQP83W1KTMXE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cbf22ea1591837bd98cad4630de112d1dd845c5ec17513dee07ae6b884147a7 +size 4427 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/E2/L159AMTR83MORHTF2GEOKE.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/E2/L159AMTR83MORHTF2GEOKE.uasset new file mode 100644 index 0000000..23ce886 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/E2/L159AMTR83MORHTF2GEOKE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecc364fc3ca8ac6be41fd6678969db9988c321b485fd2e9631fb4accef3a242a +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/L5/790AP8RYBMX9YBLGTW6WE6.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/L5/790AP8RYBMX9YBLGTW6WE6.uasset new file mode 100644 index 0000000..eedefff --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/3/L5/790AP8RYBMX9YBLGTW6WE6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:401926d52aa019c3ecf608045ecaf76a25bc3476b91edefe3934ae039ad93fe0 +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/4/CQ/I205QOSSXONYWBP69RVMVA.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/4/CQ/I205QOSSXONYWBP69RVMVA.uasset new file mode 100644 index 0000000..b619475 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/4/CQ/I205QOSSXONYWBP69RVMVA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:239c53042288f4b190cd736dd95a09c4d781ff0e6caa278c473b329c04d00869 +size 4585 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/25/3IO0LF8AOO4YLSEAEN2JO1.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/25/3IO0LF8AOO4YLSEAEN2JO1.uasset new file mode 100644 index 0000000..5847492 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/25/3IO0LF8AOO4YLSEAEN2JO1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb301f5c7c1357068be1db6ac00e786d09d8d75f48d5247b6e5a8d71c25d005e +size 4667 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/9M/BJR5SDQDQW7QDFFPNUUMNX.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/9M/BJR5SDQDQW7QDFFPNUUMNX.uasset new file mode 100644 index 0000000..50e4d02 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/9M/BJR5SDQDQW7QDFFPNUUMNX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf8f07d3823652f9ccaa9a51a90437e459121c2b4bb3ab4f9e068d83c279c992 +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/KG/ETKAO35ANVW90XFH3J8GJ2.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/KG/ETKAO35ANVW90XFH3J8GJ2.uasset new file mode 100644 index 0000000..0cdb4b9 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/KG/ETKAO35ANVW90XFH3J8GJ2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c46a9b87b994d4980b31ae98b17c43bdfad88ee012bf86381edcd3b097a9baa8 +size 4257 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/W9/ZAAGYIUQZ2W6WEO3HPXAX7.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/W9/ZAAGYIUQZ2W6WEO3HPXAX7.uasset new file mode 100644 index 0000000..e71498c --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/5/W9/ZAAGYIUQZ2W6WEO3HPXAX7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e271778dbd64a2415a3153b7876bd837aa8e8c5162346b566340d3b3851682f +size 4259 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/3C/KAT90QYQLFOHNMOF9BEDZK.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/3C/KAT90QYQLFOHNMOF9BEDZK.uasset new file mode 100644 index 0000000..0665fbf --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/3C/KAT90QYQLFOHNMOF9BEDZK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a280012bb325b7138a87a9972d3a7cd296e86c11a3ac019fb0f2948356dd693f +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/8I/HFL05AWIVBP8M8UXTV4H5K.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/8I/HFL05AWIVBP8M8UXTV4H5K.uasset new file mode 100644 index 0000000..e675bd4 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/8I/HFL05AWIVBP8M8UXTV4H5K.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13b40bea681cb7072c2b45cd7195a9086efd9feab31d168a47c3b71ce7c1a5fc +size 4259 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/G9/77SUGCMHUBU5E7FP1DLCVD.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/G9/77SUGCMHUBU5E7FP1DLCVD.uasset new file mode 100644 index 0000000..52f6193 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/G9/77SUGCMHUBU5E7FP1DLCVD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01e9ed1e1a92c8093e7d59b553b7bd63dd852044a4ace54aca2bda83e402ff6f +size 4727 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/UK/OT5UOZ3WBJ9P30TU3DBDEK.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/UK/OT5UOZ3WBJ9P30TU3DBDEK.uasset new file mode 100644 index 0000000..f030044 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/UK/OT5UOZ3WBJ9P30TU3DBDEK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:765234f9cf1fffc1fcf1869cf10020d12a151b44f62011168800d51820853a82 +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/XM/SN8KJL01L24VVIYC52MNFR.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/XM/SN8KJL01L24VVIYC52MNFR.uasset new file mode 100644 index 0000000..5152b62 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/XM/SN8KJL01L24VVIYC52MNFR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ad373eaffb2ea7902d5490935cf3157178f469af5dae89d727357cd566750ea +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/YB/C5UDZYKFL5M0YW62JXMPIZ.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/YB/C5UDZYKFL5M0YW62JXMPIZ.uasset new file mode 100644 index 0000000..4b13f85 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/6/YB/C5UDZYKFL5M0YW62JXMPIZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b045e31b99e0d6e4c161d5df031e778a48379970df98a9d09375336842bce36d +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/GV/W5DNM2FP1ON7VGU0C2BGMV.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/GV/W5DNM2FP1ON7VGU0C2BGMV.uasset new file mode 100644 index 0000000..c3d41ac --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/GV/W5DNM2FP1ON7VGU0C2BGMV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:990532545c8d3f95f46d757d5e3b213ffeeeec56a8d72faced411ed722e576a7 +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/JD/OCW0UZT4ANZZD9YHEAOMAP.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/JD/OCW0UZT4ANZZD9YHEAOMAP.uasset new file mode 100644 index 0000000..fda6e24 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/JD/OCW0UZT4ANZZD9YHEAOMAP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4e38728841b251774dc04a0cd449732d3658a95b3d878b3b37e038896b3c7f4 +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/O7/IHUOIGG1MW1YZY097JJ8O7.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/O7/IHUOIGG1MW1YZY097JJ8O7.uasset new file mode 100644 index 0000000..c49e999 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/O7/IHUOIGG1MW1YZY097JJ8O7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8996f954790c768ba172b9e23d93826ee3527e4510742821a6d5b7347fb13811 +size 4427 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/XU/RW3P9HUUCOCG5TL3TPG6XF.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/XU/RW3P9HUUCOCG5TL3TPG6XF.uasset new file mode 100644 index 0000000..56657cd --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/7/XU/RW3P9HUUCOCG5TL3TPG6XF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c9902b418c6e61ab3208906a24a61759b50b14eddde562be5de934829c0ea3d +size 4371 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/0N/1OONKTGJMLVBN21M6JE59I.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/0N/1OONKTGJMLVBN21M6JE59I.uasset new file mode 100644 index 0000000..8d0aa30 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/0N/1OONKTGJMLVBN21M6JE59I.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:200009c1fdc32c8dac2957472f868f53fcb9443f322327497ec71018c9f2530a +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/7A/C0UVMH95QVQO1KMTVK7MSB.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/7A/C0UVMH95QVQO1KMTVK7MSB.uasset new file mode 100644 index 0000000..7391214 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/7A/C0UVMH95QVQO1KMTVK7MSB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb78f3ea599e5d0192c7dcf0a8e5a17a1201fc07385f45e040550e5d5418846b +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/HN/XXZLD30WH49IXWEHJXSVAR.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/HN/XXZLD30WH49IXWEHJXSVAR.uasset new file mode 100644 index 0000000..86f2495 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/HN/XXZLD30WH49IXWEHJXSVAR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e91d1cf1be0495280cfb1d81ca3ce780e3dda437ba9615e3320874a7b38bdaa +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/VS/XX060WNO6GEZU5BZQCLZPP.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/VS/XX060WNO6GEZU5BZQCLZPP.uasset new file mode 100644 index 0000000..260f94c --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/VS/XX060WNO6GEZU5BZQCLZPP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d46bb9f7cd67ba05478b0253eeca463f1d9c5c91d7a14dd7c31e442cd3c4d4f +size 5152 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/WI/FHUVUALB8C8XRJ0PY9XXTI.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/WI/FHUVUALB8C8XRJ0PY9XXTI.uasset new file mode 100644 index 0000000..b6644bf --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/WI/FHUVUALB8C8XRJ0PY9XXTI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2869c44a01b31617b0d4cfad8d6a0c91d67e25b15a33c7e14ce1755efda3fc7 +size 4727 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/XH/SKCKQTQDTE8ZNW6C0FCBRO.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/XH/SKCKQTQDTE8ZNW6C0FCBRO.uasset new file mode 100644 index 0000000..697fba8 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/8/XH/SKCKQTQDTE8ZNW6C0FCBRO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1656426c30aaf8411663649dc131649fa75fe8d8f0fde5b502ff73b74b73d0fd +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/5G/29Z6AXUGZPZ0CXHLK2DICG.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/5G/29Z6AXUGZPZ0CXHLK2DICG.uasset new file mode 100644 index 0000000..4a76e84 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/5G/29Z6AXUGZPZ0CXHLK2DICG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be525ecb970386358b3ff94791f5dbe1a04eb58cbaf4a63ece318a8d0d101d33 +size 3143 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/6V/AV0JKCFBVPU58UEBGB0GC0.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/6V/AV0JKCFBVPU58UEBGB0GC0.uasset new file mode 100644 index 0000000..867d3b2 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/6V/AV0JKCFBVPU58UEBGB0GC0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdd245925ceaf4b4c59d07f1aab5610db0450523e10afb118b3a56cddfa802fd +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/EE/OCR348BHEJWLHO72TR249H.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/EE/OCR348BHEJWLHO72TR249H.uasset new file mode 100644 index 0000000..29a7bf7 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/EE/OCR348BHEJWLHO72TR249H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0de101b829a7fc08e4b66fd830209d2546bce035009bc86fa7077aef9f6f91cb +size 4427 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/LX/1K6D4FIEJMOF50LSVJKFMP.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/LX/1K6D4FIEJMOF50LSVJKFMP.uasset new file mode 100644 index 0000000..f51c94e --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/LX/1K6D4FIEJMOF50LSVJKFMP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c54a64753205d3fdf3f097a72075c75e64bab20424be893332c354e8bec09f32 +size 2530 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/UM/1F7R5WQFM2D9KH7A94JFBU.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/UM/1F7R5WQFM2D9KH7A94JFBU.uasset new file mode 100644 index 0000000..7eb52c3 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/9/UM/1F7R5WQFM2D9KH7A94JFBU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:936a6f14ece57dd7c3050effb10720f86bab8268edb3b0fa67f780a1e8946cce +size 4721 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/3J/Q8CQM512VVS7UZZW0KQRSV.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/3J/Q8CQM512VVS7UZZW0KQRSV.uasset new file mode 100644 index 0000000..bd557aa --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/3J/Q8CQM512VVS7UZZW0KQRSV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faa6fa198fa4804bf650764113c461a3d83912ad609f1837cc4b77353df96d03 +size 4721 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/8N/4L4W0MLV9WFUGRTMUBLBOP.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/8N/4L4W0MLV9WFUGRTMUBLBOP.uasset new file mode 100644 index 0000000..138bb8d --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/8N/4L4W0MLV9WFUGRTMUBLBOP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f412a0b400434b9cfe73c2f91f74b14db0d2bd7f4d5189bc3c7dae7b8ece10ae +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/BN/LKN4IB4C3UPW62GHBEKTIW.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/BN/LKN4IB4C3UPW62GHBEKTIW.uasset new file mode 100644 index 0000000..85dd781 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/BN/LKN4IB4C3UPW62GHBEKTIW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ddd5829ac624aef3e6d6e8e60daddb5937591d71b589f1dd96f6728a45c685 +size 4665 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/IP/MGVQPE8M923OBBJLZBI1PC.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/IP/MGVQPE8M923OBBJLZBI1PC.uasset new file mode 100644 index 0000000..647f007 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/A/IP/MGVQPE8M923OBBJLZBI1PC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9aa9365621fda8c4e6ec4d71896f6f20afc3692845448b121ed9314ce5f66084 +size 4719 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/0L/IL99N1JAI1J4A2DFQBQL53.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/0L/IL99N1JAI1J4A2DFQBQL53.uasset new file mode 100644 index 0000000..3354199 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/0L/IL99N1JAI1J4A2DFQBQL53.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95f0f52f115330087f4550c1a75b40a0f89ca820626f040515d19ad10d6c4fa1 +size 4667 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/2F/XTDQUHCYJJV6JCH4OJSVLG.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/2F/XTDQUHCYJJV6JCH4OJSVLG.uasset new file mode 100644 index 0000000..f8f30e1 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/2F/XTDQUHCYJJV6JCH4OJSVLG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84b421a0de897e34b06b211f13ba865a822cc34f35596f1f95bd18915d16e900 +size 4545 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/HX/PES0ONLF01PSQTJCC5USD2.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/HX/PES0ONLF01PSQTJCC5USD2.uasset new file mode 100644 index 0000000..6f79367 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/HX/PES0ONLF01PSQTJCC5USD2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b797b10826ecda36e7e2a5dcd9db2f805eef1aa30ab7155f9994b7e7955399a3 +size 4259 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/P1/LRQT09TOYHOXK9DY22EIKE.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/P1/LRQT09TOYHOXK9DY22EIKE.uasset new file mode 100644 index 0000000..86859d7 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/P1/LRQT09TOYHOXK9DY22EIKE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c11effe59153014dd5db0f65c7627309e99b262da486c73758c4c8a1f19a5d7b +size 4551 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/RX/297QBXCKTP06G7NIHIULK4.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/RX/297QBXCKTP06G7NIHIULK4.uasset new file mode 100644 index 0000000..1bc65de --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/B/RX/297QBXCKTP06G7NIHIULK4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60f28c2a70beb6455f7c9dfb9c657e1ff2222d5d7b1544a0537e757902d10312 +size 4427 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/27/6ZCCZ1F7ZO6DM3C8OLVGTF.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/27/6ZCCZ1F7ZO6DM3C8OLVGTF.uasset new file mode 100644 index 0000000..986a946 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/27/6ZCCZ1F7ZO6DM3C8OLVGTF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5da67a33b962a06bfc798be0009c01e4cfdf371c1ac3a14e1d6f2e94e4ea4b67 +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/EE/HZ5WNBFZRJYQPUA6X8TVVT.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/EE/HZ5WNBFZRJYQPUA6X8TVVT.uasset new file mode 100644 index 0000000..5916730 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/EE/HZ5WNBFZRJYQPUA6X8TVVT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:713b84f11124e7aee44b370bd50bc5c0e2a6aa2596dc0a7830491c809310d99e +size 3911 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/HY/Q7CPP7VHOXBAMAJI90W626.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/HY/Q7CPP7VHOXBAMAJI90W626.uasset new file mode 100644 index 0000000..2465b27 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/C/HY/Q7CPP7VHOXBAMAJI90W626.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ef1995a35ce0f27ff11dc3b93062db63c9d41e8edd03a62870cb22ea4322cc2 +size 4594 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/13/EPTYZCFZWXT7Z7XYKZ88XK.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/13/EPTYZCFZWXT7Z7XYKZ88XK.uasset new file mode 100644 index 0000000..0c82c9d --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/13/EPTYZCFZWXT7Z7XYKZ88XK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf85d87c37ff35dfe1cb8a40c52a061314c44b57d422a472765264e39527cd4c +size 4699 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/50/395Y4QE4IIEWI3KSE3SB6L.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/50/395Y4QE4IIEWI3KSE3SB6L.uasset new file mode 100644 index 0000000..2d145ae --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/50/395Y4QE4IIEWI3KSE3SB6L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd2515bd223d6506801eab781774531dc243870c78562ca08df664aadf8b0c03 +size 4721 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/8U/VKFLMM0CV8ZCC0P3TQGTTM.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/8U/VKFLMM0CV8ZCC0P3TQGTTM.uasset new file mode 100644 index 0000000..600ceee --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/8U/VKFLMM0CV8ZCC0P3TQGTTM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5e84da0ce8e73b66a023e358033a8fd062b96abe1b33ee5b9973926608d2713 +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/AY/KLCRMXKI9WR2P0GDY96C36.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/AY/KLCRMXKI9WR2P0GDY96C36.uasset new file mode 100644 index 0000000..330fa1d --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/AY/KLCRMXKI9WR2P0GDY96C36.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a5cd7edf92dd7d3e60de12fb2a735184096b504b4712ea8d807bc9ea22a2635 +size 3788 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/K5/NQBPXM7AM8N39CBW4ZT57P.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/K5/NQBPXM7AM8N39CBW4ZT57P.uasset new file mode 100644 index 0000000..bbe08cd --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/K5/NQBPXM7AM8N39CBW4ZT57P.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f50b777e76cd2aa8bd7b62c0fd87f812bb76d2953ffbaf51da9a881e8d1158b9 +size 4824 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/M3/6T1XG4EDG4ZEE1U9HMYL4C.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/M3/6T1XG4EDG4ZEE1U9HMYL4C.uasset new file mode 100644 index 0000000..09877fb --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/M3/6T1XG4EDG4ZEE1U9HMYL4C.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7757663530e94239db0f4978938e39e2c20b85ecda00be7b00427f7767a9415 +size 4371 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/MG/EDRUPW3EOYDDSI6HNSIVT1.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/MG/EDRUPW3EOYDDSI6HNSIVT1.uasset new file mode 100644 index 0000000..a9f1059 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/MG/EDRUPW3EOYDDSI6HNSIVT1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cf521a1730e4bf6d5f847271390917aaa219a7bee2ac9671c414e404d702f47 +size 4659 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/RI/R8L7GQXCHQGMMKBPTBJTNA.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/RI/R8L7GQXCHQGMMKBPTBJTNA.uasset new file mode 100644 index 0000000..aa734ee --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/D/RI/R8L7GQXCHQGMMKBPTBJTNA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bba4c777dd2fcd28b3f0157372f01f7de4f8e00f75a6b91a31bd3a02b33db291 +size 2401 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/96/RFQP83S9K0LC7IW8CXS6C0.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/96/RFQP83S9K0LC7IW8CXS6C0.uasset new file mode 100644 index 0000000..f233c97 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/96/RFQP83S9K0LC7IW8CXS6C0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95cc1d9fb2b7bb54552bb44ddd8a8945dd4b30596fe40f3f9cf3d78e16433ad4 +size 3690 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/JR/W7S9610Y7RWELGF93FZYAE.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/JR/W7S9610Y7RWELGF93FZYAE.uasset new file mode 100644 index 0000000..cf9a6f9 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/JR/W7S9610Y7RWELGF93FZYAE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:311c40dc59a935655b52c322a3693bbf826da5344270d3e6988c59973b004772 +size 4373 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/SS/QXUZ4IXFNKHCYFWERA1HQA.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/SS/QXUZ4IXFNKHCYFWERA1HQA.uasset new file mode 100644 index 0000000..e33db69 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/E/SS/QXUZ4IXFNKHCYFWERA1HQA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c28022e47f1ba2f85951dac32b7c0e00fff99ec5d78bdc186c1070adcd00647b +size 4257 diff --git a/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/F/4G/TYFCMQ9MC435YW6FZBF5FS.uasset b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/F/4G/TYFCMQ9MC435YW6FZBF5FS.uasset new file mode 100644 index 0000000..14e30a4 --- /dev/null +++ b/Content/__ExternalActors__/ThirdPerson/Lvl_ThirdPerson/F/4G/TYFCMQ9MC435YW6FZBF5FS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:558aafd26e2e204a85d7f4d570df7f8aa1620c135d33c47efbe43bc0256cbf52 +size 11309 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/09/6VOTF0H77B77LNPRHA1IYO.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/09/6VOTF0H77B77LNPRHA1IYO.uasset new file mode 100644 index 0000000..b00aee6 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/09/6VOTF0H77B77LNPRHA1IYO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68eff282c9b9de56fe4983835a05b48b11d5cbab04d05771c0a219d47838c432 +size 4124 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/68/TFF0KCJOKMAFWHCUNS986L.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/68/TFF0KCJOKMAFWHCUNS986L.uasset new file mode 100644 index 0000000..204c236 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/68/TFF0KCJOKMAFWHCUNS986L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:983c01ca86feeff85447566f9ac188a6ab71ce929557ff06b235b35d76a55471 +size 5397 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/6T/7MNN6LIAHBUH3LNJA8OD7O.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/6T/7MNN6LIAHBUH3LNJA8OD7O.uasset new file mode 100644 index 0000000..28aa84c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/6T/7MNN6LIAHBUH3LNJA8OD7O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4270e26d09281e9b6f4cb368fbc4812f1d3dbb4ef89a53ed5c6165ed7033b836 +size 4496 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/GY/W6UMQ08ZGD02NR2XHXMS7T.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/GY/W6UMQ08ZGD02NR2XHXMS7T.uasset new file mode 100644 index 0000000..8723c91 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/GY/W6UMQ08ZGD02NR2XHXMS7T.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4ad0d63fd2a97421e3441d71f527776cbfb3029ee2fed5696942072e981915b +size 2222 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/PY/D55A2955I299GXFMUK73NN.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/PY/D55A2955I299GXFMUK73NN.uasset new file mode 100644 index 0000000..ed82607 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/PY/D55A2955I299GXFMUK73NN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4de61f2a7659758b94a92f50d0d30add6a8b038d6e08e0602acb562fb756993 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/SK/591N2DAZZHFKKFOF53JES4.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/SK/591N2DAZZHFKKFOF53JES4.uasset new file mode 100644 index 0000000..440a335 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/0/SK/591N2DAZZHFKKFOF53JES4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0accf8887a61da2a368db50316169a37176d0ea767005cd0d74811bb8c4b742b +size 5313 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/13/96ZEEPCX5RLGE3VS3Z5F83.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/13/96ZEEPCX5RLGE3VS3Z5F83.uasset new file mode 100644 index 0000000..b77273a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/13/96ZEEPCX5RLGE3VS3Z5F83.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8158be1d4f82a32d96414ef048e72c2a7662a62dd4975d8c808225053fd06f02 +size 4571 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/7N/TMU12PWOB3PF1QBMHGAA9P.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/7N/TMU12PWOB3PF1QBMHGAA9P.uasset new file mode 100644 index 0000000..bdb5102 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/7N/TMU12PWOB3PF1QBMHGAA9P.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40c4afa9a8885d35289bdcb206a79371b778f64c54b95438c71f9b433d3663bd +size 4180 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/8V/MZ5VD1FM5EWPQ14HOUY9LL.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/8V/MZ5VD1FM5EWPQ14HOUY9LL.uasset new file mode 100644 index 0000000..1e1e32a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/8V/MZ5VD1FM5EWPQ14HOUY9LL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9a5f1e1faca63a571e908b9fdca44542aa5430b95616e61b8584404f24a39a5 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/9L/RVJQMYYFJ9NF8ATLBRGNE2.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/9L/RVJQMYYFJ9NF8ATLBRGNE2.uasset new file mode 100644 index 0000000..91f300b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/9L/RVJQMYYFJ9NF8ATLBRGNE2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19b3c00a76863cd97b119f448d21c44a0456fbb8d67901a815062ea555c7a6f3 +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/G4/J64XLYHNNKOHM68L3ATL04.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/G4/J64XLYHNNKOHM68L3ATL04.uasset new file mode 100644 index 0000000..ba66290 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/G4/J64XLYHNNKOHM68L3ATL04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92feac7096a4002b8cd23b4910140ad9b9d0d2e0961168f658f17746b75a2f47 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/K6/QEH37F755SSQDHM16RP0W6.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/K6/QEH37F755SSQDHM16RP0W6.uasset new file mode 100644 index 0000000..fb98c66 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/K6/QEH37F755SSQDHM16RP0W6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf6244e39a1f1becdb399271c5dcc5adfc56cbd6abbd8419bf3cfcee62c8d086 +size 3682 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/MO/FX52NCMV5JFYOIP51Q8D0R.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/MO/FX52NCMV5JFYOIP51Q8D0R.uasset new file mode 100644 index 0000000..9139662 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/MO/FX52NCMV5JFYOIP51Q8D0R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de24acbc4b3e3e2dfe7372dd9b62f7e73c4d46955c736320e658911482056e56 +size 5520 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/N0/UUHIOS9OWPYF8DRRUOILO0.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/N0/UUHIOS9OWPYF8DRRUOILO0.uasset new file mode 100644 index 0000000..f17be5a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/N0/UUHIOS9OWPYF8DRRUOILO0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca92b86ecb569adda0f87ee780ff66b77c622ca7e895377e136b6d7fe5412607 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/NZ/2DGYN86OICCF1JK42OM8LH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/NZ/2DGYN86OICCF1JK42OM8LH.uasset new file mode 100644 index 0000000..cec9351 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/NZ/2DGYN86OICCF1JK42OM8LH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:938b50e89d3b0f90fd543abbeb11116e8de56c8477e6002d0cdf4d336afe5983 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/Q1/54UJTQSRBUIMXTLWMQD201.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/Q1/54UJTQSRBUIMXTLWMQD201.uasset new file mode 100644 index 0000000..ecbc4f8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/Q1/54UJTQSRBUIMXTLWMQD201.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:182e3bea9b02592a81db63a5c8018dc57e6dd2d9b6008709e082eb9fd7626f8a +size 5397 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/QC/I20BJ3V98WLHGTVOPUE3TL.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/QC/I20BJ3V98WLHGTVOPUE3TL.uasset new file mode 100644 index 0000000..a668b5b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/1/QC/I20BJ3V98WLHGTVOPUE3TL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65345b3e135bd67c6d2c1b3a4e7695083e9976d6e00d82df65e736fc432a8896 +size 4354 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/DC/J79FNM591NCL4PRZU30JKH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/DC/J79FNM591NCL4PRZU30JKH.uasset new file mode 100644 index 0000000..902c2d3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/DC/J79FNM591NCL4PRZU30JKH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e2777ecbd97d6426ea63900acc1cce70cfd41928e723dd59f3cdd422215cbae +size 4468 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/E2/7WMFIN5511KNW0G94AGVMX.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/E2/7WMFIN5511KNW0G94AGVMX.uasset new file mode 100644 index 0000000..239a7fc --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/E2/7WMFIN5511KNW0G94AGVMX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f416610aef37fefa9aa0721d21d11c1c338622f33118a7fe189f51c4f3ea462 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/ES/Y759LYJCXPLAYRH2BHOD2H.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/ES/Y759LYJCXPLAYRH2BHOD2H.uasset new file mode 100644 index 0000000..dc9a70a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/ES/Y759LYJCXPLAYRH2BHOD2H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad29cd408487526dda98fb5787e1040d47d0b66db4defbe5cd530fe812ec5199 +size 3833 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/PC/QNCY9367JPRDLFY623BAWG.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/PC/QNCY9367JPRDLFY623BAWG.uasset new file mode 100644 index 0000000..4e4be10 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/PC/QNCY9367JPRDLFY623BAWG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c14c250961ba872f534ee45ed23abc005123124c2156567f88df809633114fc7 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/PN/5DVYKXIO9QXKZ6DD03JHFY.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/PN/5DVYKXIO9QXKZ6DD03JHFY.uasset new file mode 100644 index 0000000..679e10f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/PN/5DVYKXIO9QXKZ6DD03JHFY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12f972f2e7ea325db746059682bc5010b353e5f6b88e61df87e50679788f3db1 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/T8/Z9LBHJJSRJW405KOMZM5LN.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/T8/Z9LBHJJSRJW405KOMZM5LN.uasset new file mode 100644 index 0000000..7b21571 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/T8/Z9LBHJJSRJW405KOMZM5LN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c58a88ac3156bfa6b16e45fde70a281205ec7bf899ec636ec6f487b541363028 +size 4279 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/UQ/VZBO103EOK3C009CQ3SIA2.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/UQ/VZBO103EOK3C009CQ3SIA2.uasset new file mode 100644 index 0000000..a33035c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/UQ/VZBO103EOK3C009CQ3SIA2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d160eeb34c7153f8d5682d4be9f57539955f4980b4f9c7075e49f2ce26f54a7 +size 4004 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/VD/6CQW6ZVH27TP37BOERS3L5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/VD/6CQW6ZVH27TP37BOERS3L5.uasset new file mode 100644 index 0000000..a89a2db --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/VD/6CQW6ZVH27TP37BOERS3L5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:912959c672acf35393d4d3b8deb299c2f712784898132b2774203f96c4b59bb7 +size 4186 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/XD/KJJ0PM9Q2DJXW333FHZ7R0.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/XD/KJJ0PM9Q2DJXW333FHZ7R0.uasset new file mode 100644 index 0000000..c8c2d92 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/2/XD/KJJ0PM9Q2DJXW333FHZ7R0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a43361f5e917e16b35d10a6dcaa8e8aa0e07fe59f68e8b19e7784596d570fbc9 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/3E/2AV29D92911SDW8QKQ24BX.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/3E/2AV29D92911SDW8QKQ24BX.uasset new file mode 100644 index 0000000..2848a6c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/3E/2AV29D92911SDW8QKQ24BX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a51e8e425db9599a46fbee613269f3db6ecc0ee5ead203ab6b7f03985f53e4e0 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/85/TBH0DY74DPFG02QFP4HVBY.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/85/TBH0DY74DPFG02QFP4HVBY.uasset new file mode 100644 index 0000000..c680b27 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/85/TBH0DY74DPFG02QFP4HVBY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99c84d151a4ebab95b4e06bde61dc98e9f24dcb3a9a343f09efb51210d81a6a5 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/8W/TGNMGZGKIRPV4FRVB95PUT.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/8W/TGNMGZGKIRPV4FRVB95PUT.uasset new file mode 100644 index 0000000..357a99a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/8W/TGNMGZGKIRPV4FRVB95PUT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd33f2934f024ed41d6a9111c5dab02989fae679d3c84a94c73fdae13f02077a +size 12514 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/CJ/8IMDJ47RUM6RR9KKJ07RMR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/CJ/8IMDJ47RUM6RR9KKJ07RMR.uasset new file mode 100644 index 0000000..c63220a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/CJ/8IMDJ47RUM6RR9KKJ07RMR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39ac790d3e82a58d4e4b520262ea36db5f0182b502e359637986d52c7550992f +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/DE/EG6ISGHPR9UK0TU4M6ILXJ.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/DE/EG6ISGHPR9UK0TU4M6ILXJ.uasset new file mode 100644 index 0000000..d8d0915 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/DE/EG6ISGHPR9UK0TU4M6ILXJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a1c7e3c52332b11cbbe0fd064cd53bfdb20c003a342ceec6f87f021b8f3ad69 +size 4468 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/G1/8K6PTWH7EC700FSPEZEBAI.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/G1/8K6PTWH7EC700FSPEZEBAI.uasset new file mode 100644 index 0000000..1f8eed8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/G1/8K6PTWH7EC700FSPEZEBAI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:502f95bfba3a3002fff28248e1ce741944da696f3063095bbb70cf8563da07a5 +size 4561 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/GU/HHTBIYESCLLX4M9TYH2V2O.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/GU/HHTBIYESCLLX4M9TYH2V2O.uasset new file mode 100644 index 0000000..2b1d924 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/GU/HHTBIYESCLLX4M9TYH2V2O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89482245cabed1b79c21c9b57f40a34d93b78dca3286d3bb514738c40b9d5918 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/LU/MQL9YZXJP8NMBT4NJS35FE.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/LU/MQL9YZXJP8NMBT4NJS35FE.uasset new file mode 100644 index 0000000..6ea285f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/3/LU/MQL9YZXJP8NMBT4NJS35FE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a16fa1fa141e1366a2c46492566d936b8c84c4562680da419e9aed0189ae7e4 +size 4124 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/2G/4AWBEWEWJUNQ9436Q44MM8.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/2G/4AWBEWEWJUNQ9436Q44MM8.uasset new file mode 100644 index 0000000..ffda2bf --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/2G/4AWBEWEWJUNQ9436Q44MM8.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74df357507542be8e6c99312680a42e6cf9357565341c5d325c73d3a38c8d4d3 +size 5427 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/3C/BUY1N1NIXKH5ZMH2B9OHQS.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/3C/BUY1N1NIXKH5ZMH2B9OHQS.uasset new file mode 100644 index 0000000..554fbb4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/3C/BUY1N1NIXKH5ZMH2B9OHQS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d78a7932f44bb13149eb20c71d697b0229924a249efdd071e075a5ba1d6e90f9 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/4Z/0CC2QQCZ4BB1D3AHY0Q906.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/4Z/0CC2QQCZ4BB1D3AHY0Q906.uasset new file mode 100644 index 0000000..676b047 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/4Z/0CC2QQCZ4BB1D3AHY0Q906.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc22ece96e5dc29477784847f3cb66591a3ae8723bf3147c364192d92b0c7d27 +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/74/O2DL9QU8VK5L7HY1JO6IXG.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/74/O2DL9QU8VK5L7HY1JO6IXG.uasset new file mode 100644 index 0000000..bd350ca --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/74/O2DL9QU8VK5L7HY1JO6IXG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f09922b0220f1045cb79067d682090d9339d05ff22386abdd5b0a2f9891637be +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/9S/CN0ENC7UB9EH44A15Z9DS5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/9S/CN0ENC7UB9EH44A15Z9DS5.uasset new file mode 100644 index 0000000..2cb56d1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/9S/CN0ENC7UB9EH44A15Z9DS5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23b342891979017cfb63bc5b8729acefb75b40f4bf6ce3fed3c73c15eb91aa31 +size 4468 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/C9/WRKC9ED7V99C15LK7N52RX.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/C9/WRKC9ED7V99C15LK7N52RX.uasset new file mode 100644 index 0000000..25139e0 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/C9/WRKC9ED7V99C15LK7N52RX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7f5f02036c04aabeb909cf1eb1f0b64d7a782f89868f8e8eabba453c85ab37d +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/DQ/NDUDVEMBDWYTZMRHKUF2S1.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/DQ/NDUDVEMBDWYTZMRHKUF2S1.uasset new file mode 100644 index 0000000..d50794d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/DQ/NDUDVEMBDWYTZMRHKUF2S1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c7fe9a160cb58f43008142e6da651363a9aa323caa108d0194a7e4945916251 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/E0/3GAWGDPJRLAX24672Y8QI4.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/E0/3GAWGDPJRLAX24672Y8QI4.uasset new file mode 100644 index 0000000..5b14550 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/E0/3GAWGDPJRLAX24672Y8QI4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1012b9068554c3572bb042d5b2cff08fa67e554f404287658dbc38ca9317a519 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/K0/SB6TUKZ0O9035RUL6J9QPV.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/K0/SB6TUKZ0O9035RUL6J9QPV.uasset new file mode 100644 index 0000000..fa1651f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/K0/SB6TUKZ0O9035RUL6J9QPV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:831bb7196a3ba4d9eb696a500e308a943c44be3711711f8a91616634efbfc9cf +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/MK/0B83XTNUO53M03D9U4EFOU.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/MK/0B83XTNUO53M03D9U4EFOU.uasset new file mode 100644 index 0000000..ee6f9e9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/MK/0B83XTNUO53M03D9U4EFOU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d08d492f6afb1bbd2681a098404880d04036d69a903ed4c0d17aaaf0e25d168 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/Q3/S3DCYMNYH5AAJ7KBVZMOEP.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/Q3/S3DCYMNYH5AAJ7KBVZMOEP.uasset new file mode 100644 index 0000000..f616498 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/Q3/S3DCYMNYH5AAJ7KBVZMOEP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c43bc10a28f343da9549986645485218f8b92bd6cccaa96fa6ddfa8bc3503e0d +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/RN/Z1AJIFWKGGP237W3JG3GPE.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/RN/Z1AJIFWKGGP237W3JG3GPE.uasset new file mode 100644 index 0000000..fee1025 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/RN/Z1AJIFWKGGP237W3JG3GPE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:100788ee692cd899391590c200febe9d4d883d43fa37b0241d9d9074ea8738d3 +size 4462 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/T2/M3Q0393W11ULYHGZPBGWES.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/T2/M3Q0393W11ULYHGZPBGWES.uasset new file mode 100644 index 0000000..ca33acd --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/4/T2/M3Q0393W11ULYHGZPBGWES.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:111be5b67e507e6900ea39adf1466b6ec247cae88008ce67856adb254bf416b7 +size 4957 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/1I/K236CQU20O4O3XE1TLBV3U.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/1I/K236CQU20O4O3XE1TLBV3U.uasset new file mode 100644 index 0000000..87d82f4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/1I/K236CQU20O4O3XE1TLBV3U.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d81c4fc0a2f487a300419481b8d88e0124ecb22cfb105f288afef4e6ef1441e +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/5P/CWCQ7HWLG4FMXT0ZRC4TI0.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/5P/CWCQ7HWLG4FMXT0ZRC4TI0.uasset new file mode 100644 index 0000000..237284d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/5P/CWCQ7HWLG4FMXT0ZRC4TI0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47c1891d53cf865d2e6588134fd3ade8d9f67eece6560b1d7a7975f0d7538f7d +size 4066 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/5V/2ZKI0MH4J35IQ435354JH3.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/5V/2ZKI0MH4J35IQ435354JH3.uasset new file mode 100644 index 0000000..99700a7 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/5V/2ZKI0MH4J35IQ435354JH3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcee38284c292ae21af2d12b207bad1d4a37f58c706df4de8966e8591cfc2800 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/B7/C4HUJNJJBL0Y0DBF5HV1PH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/B7/C4HUJNJJBL0Y0DBF5HV1PH.uasset new file mode 100644 index 0000000..464bc64 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/B7/C4HUJNJJBL0Y0DBF5HV1PH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13ed7681f94f5e4621d5e623632ee6c86d4d0b39c394b7b1334836eb29aade80 +size 4468 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/BF/BFIXU5567HNRMQP5MJY0O1.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/BF/BFIXU5567HNRMQP5MJY0O1.uasset new file mode 100644 index 0000000..12e220a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/BF/BFIXU5567HNRMQP5MJY0O1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b66fe0a4ce6114e566e7349067800dc7d5eea6099b3eff8191fa5d4a74e69a81 +size 12113 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/EK/9F37QKGF01YU7CHDKL2KO5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/EK/9F37QKGF01YU7CHDKL2KO5.uasset new file mode 100644 index 0000000..9004900 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/EK/9F37QKGF01YU7CHDKL2KO5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f38f9ef0e924f46221e76085ce01a503394d2cefc4e527461632b4f77f8f0dd +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/OV/ZNSNNPGU4O3LUJM2II2DZH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/OV/ZNSNNPGU4O3LUJM2II2DZH.uasset new file mode 100644 index 0000000..392e166 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/5/OV/ZNSNNPGU4O3LUJM2II2DZH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ffb514276396573f96dea48980b6a525dfdd62de06e3619523652162b3f60e9 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/58/RK3NC5MNSOW06DYLLR8400.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/58/RK3NC5MNSOW06DYLLR8400.uasset new file mode 100644 index 0000000..a9a282a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/58/RK3NC5MNSOW06DYLLR8400.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79ebd2c20ad36edbbc382b458b610c4b105313a7a6118ca1198e6860104c1aaa +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/GZ/GUJXQ0SLRQY9GOI1S9KFYR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/GZ/GUJXQ0SLRQY9GOI1S9KFYR.uasset new file mode 100644 index 0000000..5d6600d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/GZ/GUJXQ0SLRQY9GOI1S9KFYR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55ef57b1be245825acfed42736f232caa87756e3465dcd8f8dda2ce490a9565a +size 5233 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/JG/SVPF4PAWLB95N3A3454HRT.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/JG/SVPF4PAWLB95N3A3454HRT.uasset new file mode 100644 index 0000000..432f6ac --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/JG/SVPF4PAWLB95N3A3454HRT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fce0ad0fa0f164fd1d62edf7617b5ec47a05bea375c0fea986b152cfa194f0e9 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/RY/MYVMN2NWF4QNT14AQUADS9.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/RY/MYVMN2NWF4QNT14AQUADS9.uasset new file mode 100644 index 0000000..f0cf109 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/RY/MYVMN2NWF4QNT14AQUADS9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c303117e647ef2d8643c11780225f8a247ad415ebf49c8c36d7b08ad44c14f8d +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/ZZ/Y9F2IUUMWMKN65LVGL93M3.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/ZZ/Y9F2IUUMWMKN65LVGL93M3.uasset new file mode 100644 index 0000000..23ed41f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/6/ZZ/Y9F2IUUMWMKN65LVGL93M3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d56aacbe20c0b86f3d0d04153d409fdad10cf59cea0a51bec7cff850c4dee82 +size 3970 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/3E/FM5O1XVO2BJK8VOAB6TSPC.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/3E/FM5O1XVO2BJK8VOAB6TSPC.uasset new file mode 100644 index 0000000..815861f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/3E/FM5O1XVO2BJK8VOAB6TSPC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5471bfb955cb783a1e02327bd312fad0633fc945353bf9c54a470bc8041ae77 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/8Q/5HSFA3MSWAHTHR0JJALDVL.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/8Q/5HSFA3MSWAHTHR0JJALDVL.uasset new file mode 100644 index 0000000..bd050be --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/8Q/5HSFA3MSWAHTHR0JJALDVL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc02d7176c87ed440de348c2ea60f7eaf302f94c18bc7e272fe801200dbf4a63 +size 4222 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/BM/7479BCOZ59Z9SD4ZOM4F9V.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/BM/7479BCOZ59Z9SD4ZOM4F9V.uasset new file mode 100644 index 0000000..e6a728d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/BM/7479BCOZ59Z9SD4ZOM4F9V.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2d54ccc0893f8f0cb5dc37677f83cf48488c092beb0022a99239d77685b1a93 +size 4428 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/JK/7MZAAVLMCDJG8N39T8CHSV.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/JK/7MZAAVLMCDJG8N39T8CHSV.uasset new file mode 100644 index 0000000..d63324d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/JK/7MZAAVLMCDJG8N39T8CHSV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a079e30eaef09cf444113718da5c492b8ea61fc6f4be9aa4130e3f2cd1a86826 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/OM/H0URW02T819PVDV28FETOW.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/OM/H0URW02T819PVDV28FETOW.uasset new file mode 100644 index 0000000..a14c5bc --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/OM/H0URW02T819PVDV28FETOW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c8fa015c42d6a6682bc087bdd0a4f18c585274da8697c64444ccf8b81541e89 +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/SI/O3Y0LUWOXJ0ISZ4831L7JJ.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/SI/O3Y0LUWOXJ0ISZ4831L7JJ.uasset new file mode 100644 index 0000000..8446605 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/SI/O3Y0LUWOXJ0ISZ4831L7JJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:111fa45214a913f3faee006cf7f0b9817f625766b7ce1337e0277d39ebca2884 +size 4180 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/UA/57QE41VBC21TQVJDEOPIDD.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/UA/57QE41VBC21TQVJDEOPIDD.uasset new file mode 100644 index 0000000..d54e2ef --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/UA/57QE41VBC21TQVJDEOPIDD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:085ef958cfcdeb76a4e96631fd997922a0b4cc2100b8ea7bc4675b9c15262171 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/XH/LZHLJ4KVLTW803TFRP2L6G.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/XH/LZHLJ4KVLTW803TFRP2L6G.uasset new file mode 100644 index 0000000..9da4560 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/XH/LZHLJ4KVLTW803TFRP2L6G.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b153c793659e150e76d671b9e0f5958bb3ab4a75b1cd3cdbace1a456e99699d2 +size 3857 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/YL/Z1OC45KSRGWRYP06FOLI06.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/YL/Z1OC45KSRGWRYP06FOLI06.uasset new file mode 100644 index 0000000..0c8530c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/YL/Z1OC45KSRGWRYP06FOLI06.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:900efb5b639defe452f743cd43b991472c3a1edc9fe12381ca2409cb3fede9ac +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/ZL/CM32V8FT81XRL4H1KIRZ82.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/ZL/CM32V8FT81XRL4H1KIRZ82.uasset new file mode 100644 index 0000000..0ccade9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/7/ZL/CM32V8FT81XRL4H1KIRZ82.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf06dab65f6048ada3e5a208ae0c72e658e8fbdbdf5ea83e6ea479b34623abd2 +size 4460 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/DC/S1EW4KLHAUP0J6WDU070LV.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/DC/S1EW4KLHAUP0J6WDU070LV.uasset new file mode 100644 index 0000000..c6c666d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/DC/S1EW4KLHAUP0J6WDU070LV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78fd1651fda265b1b95ea91f23abcdca2bb36e654ef60bb9bea23bfb5d48b9e3 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/EP/MZT58AKN5FYJDSWXBTJ4J5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/EP/MZT58AKN5FYJDSWXBTJ4J5.uasset new file mode 100644 index 0000000..93550f3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/EP/MZT58AKN5FYJDSWXBTJ4J5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cafe9195d38fde19a7ccdba60d6e60e2faaed9897617025f00cb8e24758cc73d +size 4429 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/NJ/7JIU4N386J0Y6M6DDYAUM4.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/NJ/7JIU4N386J0Y6M6DDYAUM4.uasset new file mode 100644 index 0000000..6b2fa2b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/NJ/7JIU4N386J0Y6M6DDYAUM4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50aea496dda2ee9b45fac663836af4d698068faeb65fd64138d4501dce2b9b64 +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/VT/E69L6BT44SM44CXN0MTR63.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/VT/E69L6BT44SM44CXN0MTR63.uasset new file mode 100644 index 0000000..1dc3924 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/8/VT/E69L6BT44SM44CXN0MTR63.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2228349e375d2d5d1e79cd502d398f815e68f1588d0c936a0e6e2f857ec624b +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/1J/16WYQZ5CWG9P0JJ5N5MEYL.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/1J/16WYQZ5CWG9P0JJ5N5MEYL.uasset new file mode 100644 index 0000000..05704fd --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/1J/16WYQZ5CWG9P0JJ5N5MEYL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82dcd409589dcf5b1ef3e44b832f8509883f7e552ee26e50335742291f048e66 +size 4571 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/42/MYS8TTPTRDM4WQJQIA3JBR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/42/MYS8TTPTRDM4WQJQIA3JBR.uasset new file mode 100644 index 0000000..2f40a42 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/42/MYS8TTPTRDM4WQJQIA3JBR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e4e8de322fc1aaaecf07f1d92b0ee6c7d15c18cd4801b13bab55ea681b9496a +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/5Y/RL8GWHB7J9LK8ABYT86KFK.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/5Y/RL8GWHB7J9LK8ABYT86KFK.uasset new file mode 100644 index 0000000..1e5a865 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/5Y/RL8GWHB7J9LK8ABYT86KFK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63ab41de9e3e495a8927ecc9f4aea84193cb70997006a75be9042f5d652effb6 +size 4072 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/7S/4WSAUZ9CKGL1KAB95PLUKB.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/7S/4WSAUZ9CKGL1KAB95PLUKB.uasset new file mode 100644 index 0000000..bd418f5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/7S/4WSAUZ9CKGL1KAB95PLUKB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2590e091245ba2028936ceac0081f2a832000fa6e0a2ddabade09a173aad7531 +size 4571 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/CT/XOY76XWZ289FAGBPE23VGM.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/CT/XOY76XWZ289FAGBPE23VGM.uasset new file mode 100644 index 0000000..3bc3971 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/CT/XOY76XWZ289FAGBPE23VGM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21b8b4e2f7355bf7a914d528220c5900297ec7590fa3e1934d73470a5829ac4d +size 5204 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/F7/BI9AGK5BZ5HC3OEFD71NDX.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/F7/BI9AGK5BZ5HC3OEFD71NDX.uasset new file mode 100644 index 0000000..fb6b634 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/F7/BI9AGK5BZ5HC3OEFD71NDX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbef905c515de0cb4fb899e0f1c43f966179392e08eb6b546d9480dcd4a1eb0e +size 4428 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/L9/ISAVDUPAU52L9Y0B19ZSVR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/L9/ISAVDUPAU52L9Y0B19ZSVR.uasset new file mode 100644 index 0000000..1ef1395 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/L9/ISAVDUPAU52L9Y0B19ZSVR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5e685fd7e1db8006813c26dce06bb460dc052cd3369dbb371e9aafebe4994bf +size 4186 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/UK/VIHECZYKQBHOHTQJ5HOP5N.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/UK/VIHECZYKQBHOHTQJ5HOP5N.uasset new file mode 100644 index 0000000..dbdffce --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/UK/VIHECZYKQBHOHTQJ5HOP5N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd14dc333ee3c440e528d8b4587b0e9039cc6380a28a01bee0f618cd355dd9ff +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/WD/1RTVDV9K0CECLS8KGYNIWK.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/WD/1RTVDV9K0CECLS8KGYNIWK.uasset new file mode 100644 index 0000000..72793fb --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/WD/1RTVDV9K0CECLS8KGYNIWK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4ed44c6b0d2db4debd07bc11733af4846b630176a8025bb9e9da080a38abc1d +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/YB/DGOD6T41WFMLGX79EE8K93.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/YB/DGOD6T41WFMLGX79EE8K93.uasset new file mode 100644 index 0000000..03485d2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/9/YB/DGOD6T41WFMLGX79EE8K93.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a79839a2c9af13897691a151032aaf11df2ddd6f0dd00f804be20ba8b4e13d70 +size 4066 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/1C/B670KN293LRVUI9KPDJYZQ.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/1C/B670KN293LRVUI9KPDJYZQ.uasset new file mode 100644 index 0000000..f0c1d21 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/1C/B670KN293LRVUI9KPDJYZQ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d32700115319a150f4a60f5e82009a865768475042e15161be11e5ff3520eaca +size 4165 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/4Y/92E37ZMC15SJHI4WVOAUJF.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/4Y/92E37ZMC15SJHI4WVOAUJF.uasset new file mode 100644 index 0000000..854e96a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/4Y/92E37ZMC15SJHI4WVOAUJF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38b4859376e809a5398209b8c43f635833c33313f2133ddd45e89bd76ee1a2f2 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/6J/4ZIILPFTQ6GFUC2XONSULT.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/6J/4ZIILPFTQ6GFUC2XONSULT.uasset new file mode 100644 index 0000000..bbe1a18 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/6J/4ZIILPFTQ6GFUC2XONSULT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dce310e374a29c5617b03576766675037c67246233d456803a278be7934a5fa7 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/7Y/VJ8782056EN0L3U58SXFHI.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/7Y/VJ8782056EN0L3U58SXFHI.uasset new file mode 100644 index 0000000..9bc497b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/7Y/VJ8782056EN0L3U58SXFHI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7940f3aa48c6490c127cfdfac4dd4624c66c6d5f73377e12fd7d18cb41aed0e6 +size 3572 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/IZ/RAFMPUO8GU8O5DPTYQX1R0.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/IZ/RAFMPUO8GU8O5DPTYQX1R0.uasset new file mode 100644 index 0000000..922e1f1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/IZ/RAFMPUO8GU8O5DPTYQX1R0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cf952cb47f823f92c787f415502141e5024e1188a30c39392ff304c3f45d72b +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/RX/HCSASZZNTMSQ8CQ8W60SV1.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/RX/HCSASZZNTMSQ8CQ8W60SV1.uasset new file mode 100644 index 0000000..0b37d9b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/RX/HCSASZZNTMSQ8CQ8W60SV1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:456403b2b3b638baa3c3a833c17d4114fcde77efff4b0270a86c8c1fe314d129 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/T7/0YPDDNSZW9JPKHNAMZOYH6.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/T7/0YPDDNSZW9JPKHNAMZOYH6.uasset new file mode 100644 index 0000000..62ad513 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/T7/0YPDDNSZW9JPKHNAMZOYH6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:979ef19976196a3c0809d5cf14d061be8bcdf23b34afb6207a77bc64b1c05e9d +size 3800 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/U6/PB0X7ZBOLQE6CEQQV3DVW5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/U6/PB0X7ZBOLQE6CEQQV3DVW5.uasset new file mode 100644 index 0000000..2e90054 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/A/U6/PB0X7ZBOLQE6CEQQV3DVW5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14462d4f95cde27def14ebe4548f6b2e3de67e8955e0deaa2af64f30ca7e9e9e +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/3C/RADELFHIH52GWIX5947EMP.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/3C/RADELFHIH52GWIX5947EMP.uasset new file mode 100644 index 0000000..bf3e712 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/3C/RADELFHIH52GWIX5947EMP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afdb40081c75dae1713eae72fbf137d03ebbd732b3d55ce4562832fa44a3f81d +size 4217 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/41/958IOENSA2728UXMR02FI9.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/41/958IOENSA2728UXMR02FI9.uasset new file mode 100644 index 0000000..0e8de44 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/41/958IOENSA2728UXMR02FI9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68c467c377ad93b2f74dbd368fc85a2cc51fcc3997fc148dafd841fe7eb0eaa0 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/B3/SAWMSAU314L3NNBWR7W4D6.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/B3/SAWMSAU314L3NNBWR7W4D6.uasset new file mode 100644 index 0000000..c97f17e --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/B3/SAWMSAU314L3NNBWR7W4D6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:102abca4e8fba1506cef9f820e5bec21132f8a5d04db810135781d14b179d4fc +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/FI/RBBFX2WPX0SZJJYN6C8QXA.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/FI/RBBFX2WPX0SZJJYN6C8QXA.uasset new file mode 100644 index 0000000..49804ec --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/FI/RBBFX2WPX0SZJJYN6C8QXA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81f1c193f0006cce52b8ee37e53bda6ebbb6d3e2ecdb9ad5b2feb5696f0af7d9 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/IS/GP5HYM7VCE5DAG4X5BCLTR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/IS/GP5HYM7VCE5DAG4X5BCLTR.uasset new file mode 100644 index 0000000..6983702 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/IS/GP5HYM7VCE5DAG4X5BCLTR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6d6d91f1696421ad4bfaa37d46ea05080e2b0b0a1499863571201b996ce9fec +size 2244 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/NJ/5Y1VQUNTF8AFC4KPGYNOPY.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/NJ/5Y1VQUNTF8AFC4KPGYNOPY.uasset new file mode 100644 index 0000000..e442b6d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/NJ/5Y1VQUNTF8AFC4KPGYNOPY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1911786a6c0bd3cd42146e7b4602d5b29803983ab77a89f5969b0b4b123573b +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/RM/0ZAUNU1TI4K8V3F9W7FWX1.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/RM/0ZAUNU1TI4K8V3F9W7FWX1.uasset new file mode 100644 index 0000000..abb95de --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/RM/0ZAUNU1TI4K8V3F9W7FWX1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:036940cce4892ba5554513e9e52d9442c0f2fce0e6b547e78c8b49655289a065 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/S1/K7PEL8F0LO6OYJG2NMIOPV.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/S1/K7PEL8F0LO6OYJG2NMIOPV.uasset new file mode 100644 index 0000000..a1f503f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/S1/K7PEL8F0LO6OYJG2NMIOPV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a0dcc7924ede671cafe1457a4501e0676c223f4c8bbd34b7bac822178f01213 +size 4180 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/U6/OYWNWHCBUR6VJ1KQ2YG1EL.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/U6/OYWNWHCBUR6VJ1KQ2YG1EL.uasset new file mode 100644 index 0000000..9405b89 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/U6/OYWNWHCBUR6VJ1KQ2YG1EL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:735d05cb073e40b1f94271d8c03b392813e9b8db8b7f4d529b223d564feeebe6 +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/YE/OSR9D90IZ8XS3U3U9JOZMT.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/YE/OSR9D90IZ8XS3U3U9JOZMT.uasset new file mode 100644 index 0000000..2e7f3ce --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/B/YE/OSR9D90IZ8XS3U3U9JOZMT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d8dfe213b9f021930712982519c1ee0147a7921629d4b5b73d4ca6109a5d2fe +size 4180 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/0V/XLEE1T2PHH0O58PW97TAGB.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/0V/XLEE1T2PHH0O58PW97TAGB.uasset new file mode 100644 index 0000000..85dc36a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/0V/XLEE1T2PHH0O58PW97TAGB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e3c791b77f480ecabc1ff6d53412b810f487de53b8e5473fc44932d01d1d402 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/2I/TKDUF5QTLUB3M3LINOWE54.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/2I/TKDUF5QTLUB3M3LINOWE54.uasset new file mode 100644 index 0000000..3bc1ba3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/2I/TKDUF5QTLUB3M3LINOWE54.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ac8f0c60bc748da5f007b0f857b594ac9b85042240ed584036e180afd9f38bd +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/52/L0UWST7CZ30C6XW4U9WDUN.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/52/L0UWST7CZ30C6XW4U9WDUN.uasset new file mode 100644 index 0000000..6250d84 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/52/L0UWST7CZ30C6XW4U9WDUN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dabf967d6b7da586f8c48920ff0930488ac0251a931d178962403baffa20c89 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/5J/S7RNJ6GME3RDR5K4S4BA7C.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/5J/S7RNJ6GME3RDR5K4S4BA7C.uasset new file mode 100644 index 0000000..b6a4b44 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/5J/S7RNJ6GME3RDR5K4S4BA7C.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce9e2464e8991264c324a34285b007a88e882e79e3632c3bc9910d37fb7b6bef +size 4430 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/CF/CCVPG4FRPH1SRANJGHB4AW.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/CF/CCVPG4FRPH1SRANJGHB4AW.uasset new file mode 100644 index 0000000..62d0518 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/CF/CCVPG4FRPH1SRANJGHB4AW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00c51549dc435e8673dfc9eef0e0589b89b5c7172067072842844b1b7efbfe39 +size 4224 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/D3/0IZLBUD8D8FRFZ3X6FS0NL.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/D3/0IZLBUD8D8FRFZ3X6FS0NL.uasset new file mode 100644 index 0000000..cac7248 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/D3/0IZLBUD8D8FRFZ3X6FS0NL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26f5c13807beec7f5b751bfd82fae3669d4b796e820a868a073475603819b3f6 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/DN/PSZEID3KH3UCA6N4JJ7EH5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/DN/PSZEID3KH3UCA6N4JJ7EH5.uasset new file mode 100644 index 0000000..3b69ae6 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/DN/PSZEID3KH3UCA6N4JJ7EH5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ac5256201ef3cdb737954097f7718a6ac82b7f5c739e7a777388319ac8abebe +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/H3/0XSTNQS7WWXGF0W0R0MHYH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/H3/0XSTNQS7WWXGF0W0R0MHYH.uasset new file mode 100644 index 0000000..beee888 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/H3/0XSTNQS7WWXGF0W0R0MHYH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c73314131c7cb1c23dbbd50398baf86b4818f3fc991371a8e9988c6c424b3e83 +size 4124 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/IC/82GXHIQ1LBSS75HKJS22Z1.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/IC/82GXHIQ1LBSS75HKJS22Z1.uasset new file mode 100644 index 0000000..ae4c10b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/IC/82GXHIQ1LBSS75HKJS22Z1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3265f32b580593151e8d4f29767a8904750f0204fc7c1c55d6be95bb60c97d01 +size 4457 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/OQ/QSHJBZFA3DH4WUMPYR0F5P.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/OQ/QSHJBZFA3DH4WUMPYR0F5P.uasset new file mode 100644 index 0000000..c5cfbb8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/OQ/QSHJBZFA3DH4WUMPYR0F5P.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67f1cb67f86439bdcc15da778d7d54697bd1e4a69a3cd292f05d2174b5285583 +size 5427 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/R9/L3U9JKOV9CIMSF7EVCJIZH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/R9/L3U9JKOV9CIMSF7EVCJIZH.uasset new file mode 100644 index 0000000..2e1f86a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/R9/L3U9JKOV9CIMSF7EVCJIZH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d0b0101dfb20b2787d84b21b2cca693efa22047ebe8d06019863823b16d2014 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/S5/R35THGWMTZWY37KCLGIB7L.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/S5/R35THGWMTZWY37KCLGIB7L.uasset new file mode 100644 index 0000000..54386e9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/S5/R35THGWMTZWY37KCLGIB7L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9111a53bb029fbf9834fad87b49ff15e066535f9987ecb3ef8ade9769461247d +size 5855 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/WL/P9Y29NLS25OX7A4GU66A6A.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/WL/P9Y29NLS25OX7A4GU66A6A.uasset new file mode 100644 index 0000000..9196c7f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/WL/P9Y29NLS25OX7A4GU66A6A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b114fd87cb46a1edcd60713c97c7373cd0afe1e8896d44e055ffa01880bc9ba7 +size 4354 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/ZI/29MX5OP77Y9OOZ7V1YCBUM.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/ZI/29MX5OP77Y9OOZ7V1YCBUM.uasset new file mode 100644 index 0000000..ace9248 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/C/ZI/29MX5OP77Y9OOZ7V1YCBUM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4af6cbd224fd56d584af4ceba640f8ad6be0815c2f999c02fb553fd86d5fef1a +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/09/ZZRW8OHLRZDO5O0926MMPR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/09/ZZRW8OHLRZDO5O0926MMPR.uasset new file mode 100644 index 0000000..b00211d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/09/ZZRW8OHLRZDO5O0926MMPR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fca236e85772d79671ae0d68ca187cc2f018b27dd51a3d334c9d59c949df7b8 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/0N/93KJOJF9EXQN0RAXMTNKDR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/0N/93KJOJF9EXQN0RAXMTNKDR.uasset new file mode 100644 index 0000000..b286b22 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/0N/93KJOJF9EXQN0RAXMTNKDR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1397b74e2a1e22f14742e1acfa69ee14355a0b02878866763148e4fe617ec933 +size 4224 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/61/ITYUBBWV7Y4IQXOLL3OQJZ.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/61/ITYUBBWV7Y4IQXOLL3OQJZ.uasset new file mode 100644 index 0000000..cee2d1d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/61/ITYUBBWV7Y4IQXOLL3OQJZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a71a4b9819dd8816830578af5c7374ad00eca6751a27567d53555df8ab4845a +size 4345 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/75/S72Z416K7C5SQ26QAZYHIC.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/75/S72Z416K7C5SQ26QAZYHIC.uasset new file mode 100644 index 0000000..4d29fe4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/75/S72Z416K7C5SQ26QAZYHIC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ae3cd8b5bae13328f3aa68d6305896e2302be72a2ab37499fdf5fd2a32b1b65 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/AC/AU94FKCJ1ZPAVYN19SWNSR.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/AC/AU94FKCJ1ZPAVYN19SWNSR.uasset new file mode 100644 index 0000000..ad3f5e5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/AC/AU94FKCJ1ZPAVYN19SWNSR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ed412c99bbe6279d4c46263eaca0289657e88a4d32d57a255750bfdc18538e9 +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/B0/ZE8C59CK81PJ77IL1LVLQU.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/B0/ZE8C59CK81PJ77IL1LVLQU.uasset new file mode 100644 index 0000000..60a78d0 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/B0/ZE8C59CK81PJ77IL1LVLQU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37c0c8e99826f431693e790adbbf5cb1ac7612a9af0b71879b5a0eaf460fe976 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/O0/ICNATY20XOMXIO9PWTLC46.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/O0/ICNATY20XOMXIO9PWTLC46.uasset new file mode 100644 index 0000000..16fcc3b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/O0/ICNATY20XOMXIO9PWTLC46.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45e0a1138cda33898a4fe8af6a596dc4ca70abdf204ee28daa9e562e06505e81 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/OO/N782ZG44Y5GSTV48DK6NHT.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/OO/N782ZG44Y5GSTV48DK6NHT.uasset new file mode 100644 index 0000000..5985aaf --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/OO/N782ZG44Y5GSTV48DK6NHT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2f4e422385fa0cc489dc215334513681ae9744380deb446575317bd64cd2b05 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/QZ/IDA5I0RVDBWJM3XO7DN7BU.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/QZ/IDA5I0RVDBWJM3XO7DN7BU.uasset new file mode 100644 index 0000000..425de38 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/QZ/IDA5I0RVDBWJM3XO7DN7BU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37d648cf38ef06295f2f9bb9a5740a6af05d3e130c23540d5699e4700ed99ed5 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/RR/E36ZI764OLQ2HQNVTOL4I0.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/RR/E36ZI764OLQ2HQNVTOL4I0.uasset new file mode 100644 index 0000000..d1f7590 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/RR/E36ZI764OLQ2HQNVTOL4I0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a922a927ec2e8dc4496b86e080b48680e68b41944e79784480612a2b0d4d8c0b +size 8090 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/ZN/AASHM8JVSL0T04BL1PKPVV.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/ZN/AASHM8JVSL0T04BL1PKPVV.uasset new file mode 100644 index 0000000..7a871dc --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/D/ZN/AASHM8JVSL0T04BL1PKPVV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f45b1d5861a3cf514a7621533bfdfea71c48455f1337db23a87d714f8079fdeb +size 11372 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/0W/BXUQNB8M3HHSJ6SCAVEGS7.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/0W/BXUQNB8M3HHSJ6SCAVEGS7.uasset new file mode 100644 index 0000000..a69b964 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/0W/BXUQNB8M3HHSJ6SCAVEGS7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ee80d7fce82b1ade16aac73da5f4252f6abcdec5d6ee1cdee650f1ed7f4a729 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/27/GZJOI0Z35GOANSWBGT9QY9.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/27/GZJOI0Z35GOANSWBGT9QY9.uasset new file mode 100644 index 0000000..32ed091 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/27/GZJOI0Z35GOANSWBGT9QY9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dedc974d8c925deb73e9e7841b9b4bdf332141c3a18b091a075a4213b93ec82 +size 5427 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/5H/SXKH8U4XMAUA5AFBNY1M9I.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/5H/SXKH8U4XMAUA5AFBNY1M9I.uasset new file mode 100644 index 0000000..9015f69 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/5H/SXKH8U4XMAUA5AFBNY1M9I.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc7616cdd40ece7b1e57d65759371ca18e9fde7509a59f28175195fed1224f59 +size 4180 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/C3/SA8IH98KFTNCIYFK2VCP5C.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/C3/SA8IH98KFTNCIYFK2VCP5C.uasset new file mode 100644 index 0000000..d5ca9b2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/C3/SA8IH98KFTNCIYFK2VCP5C.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9b40963abb4e475f14117a9053fce81348ebf212df13670c7f84328837d77af +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/FF/4T2DI6DVP9S9AFO2356BSH.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/FF/4T2DI6DVP9S9AFO2356BSH.uasset new file mode 100644 index 0000000..dfc898c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/FF/4T2DI6DVP9S9AFO2356BSH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c785c99b98c3d620336325711d4a1b12393b3edba99a4895686ad15971868c4a +size 5522 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/IM/TWHLFKFH4DB824NJJJLC1H.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/IM/TWHLFKFH4DB824NJJJLC1H.uasset new file mode 100644 index 0000000..da280a2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/IM/TWHLFKFH4DB824NJJJLC1H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1b64f0d70f51065dca3666160612a855c2b3d23d90ec721e0b8f4b4ceb02c55 +size 4428 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/J9/Q4B9M2NH0W56UM3XIMZMOZ.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/J9/Q4B9M2NH0W56UM3XIMZMOZ.uasset new file mode 100644 index 0000000..b156372 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/J9/Q4B9M2NH0W56UM3XIMZMOZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9c27058803ba94908657a8caa837acdb9c67571da0fcce6e8977abdb579e0c3 +size 4428 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/K5/S1VK675CG7GLA667I2TYT5.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/K5/S1VK675CG7GLA667I2TYT5.uasset new file mode 100644 index 0000000..faa2836 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/K5/S1VK675CG7GLA667I2TYT5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a23ff2df7f41813ebe4bea59c8a9bea1ac0918727fce8e6117803a0c020f9c2 +size 5638 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/KK/RKM41UD17P08BSJT6UZVLJ.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/KK/RKM41UD17P08BSJT6UZVLJ.uasset new file mode 100644 index 0000000..5f68700 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/KK/RKM41UD17P08BSJT6UZVLJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e974ad2f6a17041619d37f21134715e7522bfb2dfd0ad268ff50e7e3ad7d636f +size 4224 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/Y5/G83AFQCGFHSD24L1L4S5WO.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/Y5/G83AFQCGFHSD24L1L4S5WO.uasset new file mode 100644 index 0000000..7796dc1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/Y5/G83AFQCGFHSD24L1L4S5WO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:900f066af4c4528f5ec9719c06978be3b16879d9a8f6cb72dee22296be15cdf9 +size 4413 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/YO/13HRCDN18BGJI0B1LGKN1T.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/YO/13HRCDN18BGJI0B1LGKN1T.uasset new file mode 100644 index 0000000..fa6b251 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/E/YO/13HRCDN18BGJI0B1LGKN1T.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c91027f59de9d547f7336f3e95cf05adb69625b6398428b73e0459053796f763 +size 5528 diff --git a/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/F/5B/VVZB345TJTB0CL0BS349YF.uasset b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/F/5B/VVZB345TJTB0CL0BS349YF.uasset new file mode 100644 index 0000000..16a30e8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Combat/Lvl_Combat/F/5B/VVZB345TJTB0CL0BS349YF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9db4fa2865c0213f3b2aff10f69c1bfc354c6ee4ce544ab9a9633bcdb93226a +size 5522 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/4B/I5O7HJ57YPKKYPY4SSFLZZ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/4B/I5O7HJ57YPKKYPY4SSFLZZ.uasset new file mode 100644 index 0000000..a1e53de --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/4B/I5O7HJ57YPKKYPY4SSFLZZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ced22be2e4fb66c8ac87a99ddc1433b31f430eae2515c649a0841cb9e6e52a7e +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/J0/QVXJ1XUJQIZQ2ONEJOW0EI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/J0/QVXJ1XUJQIZQ2ONEJOW0EI.uasset new file mode 100644 index 0000000..5ad3507 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/J0/QVXJ1XUJQIZQ2ONEJOW0EI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87c48872e6e55af4c53f34d37e1b50641cb36c75725694bc8439951042d10e80 +size 4339 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/JN/C6PH50SPLFLBWA0OBWMQ5F.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/JN/C6PH50SPLFLBWA0OBWMQ5F.uasset new file mode 100644 index 0000000..bf347ff --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/JN/C6PH50SPLFLBWA0OBWMQ5F.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c80c1ed5693ee42e5f0d909df78aa72937084156ce92a3e6c30e2aec99861a70 +size 4159 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/KB/70R3R0AIAG8WCGCAGQ9CY3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/KB/70R3R0AIAG8WCGCAGQ9CY3.uasset new file mode 100644 index 0000000..45c6d04 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/KB/70R3R0AIAG8WCGCAGQ9CY3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05f4439de29a85ed30c25fa1384bf56d2ef17bb1d3ebf50098933884c2873f5d +size 4457 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/L0/7JFGLNLOCKI0V1IMMACK8B.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/L0/7JFGLNLOCKI0V1IMMACK8B.uasset new file mode 100644 index 0000000..0005c1f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/L0/7JFGLNLOCKI0V1IMMACK8B.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e90e0d310b6b6da67e5fdc7321cb7bcc0a09f8e0d12453ed752eed064eb93210 +size 4469 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/LN/6XUGMACJHTF9UVGA53PLQ9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/LN/6XUGMACJHTF9UVGA53PLQ9.uasset new file mode 100644 index 0000000..3269ac8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/LN/6XUGMACJHTF9UVGA53PLQ9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:551e7074c02adcb86b57fce10cf68f24712139d60bd2f729bdd327e4b413beba +size 3612 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/OK/2FZGASC74XU6I8LRJ4B9LO.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/OK/2FZGASC74XU6I8LRJ4B9LO.uasset new file mode 100644 index 0000000..b979120 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/OK/2FZGASC74XU6I8LRJ4B9LO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87caf0147843609c33d33c98f5529dff8a225b914bf971a04064244d1f6f2db6 +size 4166 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/Q1/Q5QAZW7H2QSS3YP9WWH1SC.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/Q1/Q5QAZW7H2QSS3YP9WWH1SC.uasset new file mode 100644 index 0000000..4324a67 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/Q1/Q5QAZW7H2QSS3YP9WWH1SC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3346522601164f8f3c5711e8d05a260202ae1a1027358ef2952f47de0c3bf511 +size 4367 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/TH/TXPB77A5UO9PLNG838CR59.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/TH/TXPB77A5UO9PLNG838CR59.uasset new file mode 100644 index 0000000..a31a219 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/TH/TXPB77A5UO9PLNG838CR59.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dda1d4d9faa09ea1e64e4742f3a2728e56ade1072494cf33241c1ce9f7070561 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/XS/21O3C30HDVFRXZ0RL7PRMF.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/XS/21O3C30HDVFRXZ0RL7PRMF.uasset new file mode 100644 index 0000000..221e385 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/0/XS/21O3C30HDVFRXZ0RL7PRMF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a93897e81e0231ef9cc6ef84574e48acfbad569793647f47927dc8dceabe313 +size 4280 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/1O/DVDF8QZG4S920O3BQWHRO1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/1O/DVDF8QZG4S920O3BQWHRO1.uasset new file mode 100644 index 0000000..9f166ce --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/1O/DVDF8QZG4S920O3BQWHRO1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caadb513064b10263006682ae5c6719b4738b9b1098ab722b2a4f3fe7e5398fb +size 4288 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/32/9OI6KLDGH7UIFHL3YRPU1R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/32/9OI6KLDGH7UIFHL3YRPU1R.uasset new file mode 100644 index 0000000..66b2f03 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/32/9OI6KLDGH7UIFHL3YRPU1R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3b04e8441c046c401978af32195484eb86a264b7cd3d05f6650e1bef7137132 +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/3E/MP74I7I6B8KHZ3XNPOIUQK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/3E/MP74I7I6B8KHZ3XNPOIUQK.uasset new file mode 100644 index 0000000..c89e3e2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/3E/MP74I7I6B8KHZ3XNPOIUQK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cd0601b439b8cfd10e248e8f9ff06b91211d6a74a3ef735197f713c0f8b2877 +size 4461 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/4V/AM9A6SENLG8J1ID4WGVI4L.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/4V/AM9A6SENLG8J1ID4WGVI4L.uasset new file mode 100644 index 0000000..9d080cd --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/4V/AM9A6SENLG8J1ID4WGVI4L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3582f5ad8b7f88c4698150d3e8fb001f9c016982822cf4e600fbe166f9fd2e5c +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/51/5Y69443HPJ0BUZGAUHEJK3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/51/5Y69443HPJ0BUZGAUHEJK3.uasset new file mode 100644 index 0000000..68860e4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/51/5Y69443HPJ0BUZGAUHEJK3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37b11ccfc7d4dd5181eae67054ff48ae1e810195eee13b3238e9524127610430 +size 4355 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/97/XM7WH6EAJNTGEZ63GE7FJ6.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/97/XM7WH6EAJNTGEZ63GE7FJ6.uasset new file mode 100644 index 0000000..27b33d9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/97/XM7WH6EAJNTGEZ63GE7FJ6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ffa576fe465c57221c3a3a122122d11f44a35eace1f22b31362d52645b93814 +size 2284 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/GA/OEGB3A3ENQT70XN5J4YKQJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/GA/OEGB3A3ENQT70XN5J4YKQJ.uasset new file mode 100644 index 0000000..648083e --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/GA/OEGB3A3ENQT70XN5J4YKQJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b23e3d253fb26eb18f694c7bcfce9d1c3af370961c44a064ac3cdb8fce5c546 +size 4454 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/L5/QG3Z4YZSPOZSHGICCUH31A.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/L5/QG3Z4YZSPOZSHGICCUH31A.uasset new file mode 100644 index 0000000..eac2699 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/L5/QG3Z4YZSPOZSHGICCUH31A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9c017f8694438ad16c911b1e271c7c87ac292776215d5298258e349625127a7 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/N4/PELUAFNLTUJDHSXON93S6I.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/N4/PELUAFNLTUJDHSXON93S6I.uasset new file mode 100644 index 0000000..785be7a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/N4/PELUAFNLTUJDHSXON93S6I.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fbef24ac7183161e85c9e232c3d53be3d5894a8cd16b2355c013bf1db723860 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/PU/K4YJRC8WAA2CIGF549BYZR.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/PU/K4YJRC8WAA2CIGF549BYZR.uasset new file mode 100644 index 0000000..ecfa9e3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/PU/K4YJRC8WAA2CIGF549BYZR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cba4d87fa4685f1f336fe8e248976b5eb852205b9959f9c5f11a38e470726db +size 4475 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/R0/HT23SLNIEQ0O2HXL7LBX4R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/R0/HT23SLNIEQ0O2HXL7LBX4R.uasset new file mode 100644 index 0000000..7c377a1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/R0/HT23SLNIEQ0O2HXL7LBX4R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:414e27d48cb73b8a12e911744fb660a0eb903393d5ff245c623a0b06263f2773 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/T1/H5NOVVQYGVDZH2QBIXZRI5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/T1/H5NOVVQYGVDZH2QBIXZRI5.uasset new file mode 100644 index 0000000..ec40877 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/T1/H5NOVVQYGVDZH2QBIXZRI5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1cd1811177f4835486de84eb463684cfe3af9619ee2475079a616b7edc54dab +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/U0/YGL0WFXJS6FO10WOKK1V2L.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/U0/YGL0WFXJS6FO10WOKK1V2L.uasset new file mode 100644 index 0000000..9adcc98 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/U0/YGL0WFXJS6FO10WOKK1V2L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dd0587fb03d5dcd693959d1c8567ed90e8f20ce34c370fd27fc02f8708bf921 +size 4221 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/YF/EKAD5DGG3DXWMMY6JCZYDE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/YF/EKAD5DGG3DXWMMY6JCZYDE.uasset new file mode 100644 index 0000000..23b736f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/YF/EKAD5DGG3DXWMMY6JCZYDE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3a9e69128707f22d2d19ab3b894626b45cc721b00236618f62df73aca323581 +size 4598 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/ZP/9I0OZ8R10E9S06ETOOJA63.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/ZP/9I0OZ8R10E9S06ETOOJA63.uasset new file mode 100644 index 0000000..4f4dc29 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/1/ZP/9I0OZ8R10E9S06ETOOJA63.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:438e545f149dfd7550dda8e29bbe6f67c91b785e80f24352a8e23404f4b76101 +size 4363 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1C/ZUE27ERNTBGXJY0JQR479S.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1C/ZUE27ERNTBGXJY0JQR479S.uasset new file mode 100644 index 0000000..5256591 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1C/ZUE27ERNTBGXJY0JQR479S.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8a4cec913290735213c8e9594022885618524cd94105c49dad1d951a4df8ae0 +size 4457 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1R/618POQ41Q2FSSGC1VTL0AJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1R/618POQ41Q2FSSGC1VTL0AJ.uasset new file mode 100644 index 0000000..7ca48e0 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/1R/618POQ41Q2FSSGC1VTL0AJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:291db9a0d1aab242f07514b3b055a38c688a4d006b0195264e4b4303cad19149 +size 4454 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/67/LRD5AFZSX7RLAT58UVOF6S.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/67/LRD5AFZSX7RLAT58UVOF6S.uasset new file mode 100644 index 0000000..d96820b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/67/LRD5AFZSX7RLAT58UVOF6S.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bbf897505e0c2be0c92ffd6ef841c4c95775d5e957e5a8003390a6c544903ba +size 4354 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/K8/5Z205Q47ZTF15T5Q87JU7E.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/K8/5Z205Q47ZTF15T5Q87JU7E.uasset new file mode 100644 index 0000000..3d00bf6 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/K8/5Z205Q47ZTF15T5Q87JU7E.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce6b02fd42b89011ccd0305ca6cf98c4dc0b43b905a25c97d33113720833fec1 +size 4544 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/L6/9KHQMN7IUK8SMKHH3VX6M3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/L6/9KHQMN7IUK8SMKHH3VX6M3.uasset new file mode 100644 index 0000000..b50138a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/L6/9KHQMN7IUK8SMKHH3VX6M3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78a69b7be1943541b3cdd12362fbecdbbfdba17006cf2340c091a6aaa6676838 +size 4351 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/OI/MF8ZZS7KVI44SVR0BHY301.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/OI/MF8ZZS7KVI44SVR0BHY301.uasset new file mode 100644 index 0000000..53f2dbe --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/OI/MF8ZZS7KVI44SVR0BHY301.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebec28f529ed045931d21b1b67da372f049cb5ca4b9be5d5a34f0326444fe099 +size 4544 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/V9/XCZ24R2H8269E10XXKVHNG.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/V9/XCZ24R2H8269E10XXKVHNG.uasset new file mode 100644 index 0000000..3a5f49f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/V9/XCZ24R2H8269E10XXKVHNG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c6f91f0ddea2ae894175a2593c24c897251b1bba36973b1924cceccaa206519 +size 2262 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/Z9/6SNYH6YCML05ATNZJMJNLV.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/Z9/6SNYH6YCML05ATNZJMJNLV.uasset new file mode 100644 index 0000000..3e2c9c6 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/2/Z9/6SNYH6YCML05ATNZJMJNLV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e81b01e3ce50fc7e2c5f186cd2ae39a85052250487c527ff5b63bf22cc7d22d7 +size 3897 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/11/QC3UE5SH63R7HLDSIARHYP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/11/QC3UE5SH63R7HLDSIARHYP.uasset new file mode 100644 index 0000000..799f947 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/11/QC3UE5SH63R7HLDSIARHYP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f21c57b08fe658428f5dc3cc9bb890d6f73caedc27e761170729b0fed521168f +size 4168 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/1L/ITUZ7HAI87POYJ5CKEJ6JQ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/1L/ITUZ7HAI87POYJ5CKEJ6JQ.uasset new file mode 100644 index 0000000..4d55429 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/1L/ITUZ7HAI87POYJ5CKEJ6JQ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dedf76583aae61b80d73ef2b557bf3995adc26e86fd9f0f5f3a2b728a0c2ee1a +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/5C/472HXGW93Z5Y0DTU24MT05.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/5C/472HXGW93Z5Y0DTU24MT05.uasset new file mode 100644 index 0000000..e1860dd --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/5C/472HXGW93Z5Y0DTU24MT05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:763e52357f88b35d57ebc9fa34948b19a7ecc591a5f7acbd21f17670f89b2626 +size 4504 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/69/49UL41JIT9J3Z82DSEOGNR.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/69/49UL41JIT9J3Z82DSEOGNR.uasset new file mode 100644 index 0000000..7b8cfb5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/69/49UL41JIT9J3Z82DSEOGNR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:392af150eb33a291005ccc22d0913757c7f17d5d6160da4f8302c20cae169c73 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6F/7UY85E4YUBO3IIQ5WZY2TR.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6F/7UY85E4YUBO3IIQ5WZY2TR.uasset new file mode 100644 index 0000000..840dba2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6F/7UY85E4YUBO3IIQ5WZY2TR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba883708962df14dc3f57a64239f00ad5e76e7726f092f98b257ee963b33220e +size 4604 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6H/7ALASFYN40X69PEEB5RXZ2.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6H/7ALASFYN40X69PEEB5RXZ2.uasset new file mode 100644 index 0000000..7db5c72 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/6H/7ALASFYN40X69PEEB5RXZ2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d99df93164451224a106554544d5504fc78269722cf0f128a9e0d19746d4fe1a +size 4453 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/AD/OOT0TOS7NDYPON55O43E4B.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/AD/OOT0TOS7NDYPON55O43E4B.uasset new file mode 100644 index 0000000..a689a15 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/AD/OOT0TOS7NDYPON55O43E4B.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cb0dc7449c3964c79441e340547ae7e10a28a772c30b698830f0feea3e144a5 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/GD/LA9QY6EIOP5MXBBFTM03KI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/GD/LA9QY6EIOP5MXBBFTM03KI.uasset new file mode 100644 index 0000000..3a6de37 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/GD/LA9QY6EIOP5MXBBFTM03KI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fa17c68f11d1c2b5bff98fe5e3e5dd41a058c5d06dc4fdf9105ea2fbea02466 +size 4604 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/J1/ZMFUDHBD9FHM68ZT96IA1C.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/J1/ZMFUDHBD9FHM68ZT96IA1C.uasset new file mode 100644 index 0000000..f3cda49 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/J1/ZMFUDHBD9FHM68ZT96IA1C.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32fc9ef935bfd00282161cdc9d8a209c4f6175c71b265e8dfcc1316b511e71ba +size 4475 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/JO/XBLLR77AXMIP149OV5ULY9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/JO/XBLLR77AXMIP149OV5ULY9.uasset new file mode 100644 index 0000000..bf85336 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/JO/XBLLR77AXMIP149OV5ULY9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f56f1756dff7180b09735b2f54529483f7c1ddce00950619566345fb0c7d8a49 +size 4280 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/LR/AXA3SZ8RWC8FDWTY56RLDA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/LR/AXA3SZ8RWC8FDWTY56RLDA.uasset new file mode 100644 index 0000000..6440bbc --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/LR/AXA3SZ8RWC8FDWTY56RLDA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b4316d7ff207f765b661d7603be045e6f2481463f78a47eddafc85016fae432 +size 4161 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/SN/0X78Q6B7RDHXMQZYGFLGXK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/SN/0X78Q6B7RDHXMQZYGFLGXK.uasset new file mode 100644 index 0000000..4e4aea4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/SN/0X78Q6B7RDHXMQZYGFLGXK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faeb9a9851e6d3f7b72b46ec6f255b067eaa5af782da8684cc66de03d2458b97 +size 4170 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/VJ/XUG7C1X903GP7S2ZAQ6UPS.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/VJ/XUG7C1X903GP7S2ZAQ6UPS.uasset new file mode 100644 index 0000000..ca94648 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/VJ/XUG7C1X903GP7S2ZAQ6UPS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34efdb91e615a647d0340a1ff307004aeeb4f9c61f2a5e4703b5df714b2d363d +size 4457 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZC/GUWXM26Q7AB4QLO5N6TPIP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZC/GUWXM26Q7AB4QLO5N6TPIP.uasset new file mode 100644 index 0000000..76b19af --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZC/GUWXM26Q7AB4QLO5N6TPIP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0966448c774d3dc7163277c8d9fb2ad4f425b844275a0f5b2e6004edd39530f7 +size 4544 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZO/2FVRIT79WCE6J17NINDFS5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZO/2FVRIT79WCE6J17NINDFS5.uasset new file mode 100644 index 0000000..0f2f1ba --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/3/ZO/2FVRIT79WCE6J17NINDFS5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:478fb265e5ee88ec6931e9dbfc72d17655649069339f488ddf316840140fd739 +size 4230 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/2U/FNC5A4JGOWJW5YKO9E4ZYH.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/2U/FNC5A4JGOWJW5YKO9E4ZYH.uasset new file mode 100644 index 0000000..d32fdb4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/2U/FNC5A4JGOWJW5YKO9E4ZYH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6df1b1daf63910760765df82da50fe685b1fae34a5af9b01247a32fdfad47216 +size 4344 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/F1/ROZ0POEXKJ0PKXMW4DSCG1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/F1/ROZ0POEXKJ0PKXMW4DSCG1.uasset new file mode 100644 index 0000000..dad8390 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/F1/ROZ0POEXKJ0PKXMW4DSCG1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf8b3fd4cfeabd4fef328b92b99508027db8b708ab859cd7e586bb92a3c2d10e +size 4354 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/LU/26JCC0IS872O4TFGUT9O98.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/LU/26JCC0IS872O4TFGUT9O98.uasset new file mode 100644 index 0000000..b36359d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/LU/26JCC0IS872O4TFGUT9O98.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11a02f458b640d779ea95bab06b60b25294dfacf3eaf4b61c1e746a75f9ac797 +size 4537 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/OS/M2J2I7C3QIZMSSVZ2GMVVF.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/OS/M2J2I7C3QIZMSSVZ2GMVVF.uasset new file mode 100644 index 0000000..a5e9d58 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/OS/M2J2I7C3QIZMSSVZ2GMVVF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5dad37f3ae70eba6d80b5af6babeba5a4ca1bdfcfcc4aef97e75c56dee4ffa0 +size 4340 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/UV/ZAF0544EAKPRNRKQIP0O01.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/UV/ZAF0544EAKPRNRKQIP0O01.uasset new file mode 100644 index 0000000..f59487e --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/UV/ZAF0544EAKPRNRKQIP0O01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f91bf9b5cb5991d5f98b6640219b9f290e02b01514882165222eb30eefb19cd +size 4398 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/WL/YEFLQ06YUDR45W9UEV3JM5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/WL/YEFLQ06YUDR45W9UEV3JM5.uasset new file mode 100644 index 0000000..b91382c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/WL/YEFLQ06YUDR45W9UEV3JM5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb9ba12885407c18ecd672ddfa024211c0085d7292cdb25d4efbe44b162e573d +size 4352 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/XS/U8PM1GZLKWHL4FF18EN1ND.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/XS/U8PM1GZLKWHL4FF18EN1ND.uasset new file mode 100644 index 0000000..a4b2937 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/XS/U8PM1GZLKWHL4FF18EN1ND.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f74fbdbda5bba746625a1b6ec0500c05a28cfc969f2ce0f0521fb43bc20ecd9 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/ZF/WCHFY0EDKV80XWG7UZXXIX.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/ZF/WCHFY0EDKV80XWG7UZXXIX.uasset new file mode 100644 index 0000000..ee62400 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/4/ZF/WCHFY0EDKV80XWG7UZXXIX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbd64d5e7135153747f39ddc03642cc53c554b190e6cc9d1ebc30fda90d36459 +size 4544 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/10/G2ESKRA6OA5RY0JRT35GRW.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/10/G2ESKRA6OA5RY0JRT35GRW.uasset new file mode 100644 index 0000000..0edac94 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/10/G2ESKRA6OA5RY0JRT35GRW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffa07621639c2b70bc36ee9468e35451e9bcacd078c3012931e14353267ba076 +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/1I/93DDS3U8RVSY7QM30EHTKV.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/1I/93DDS3U8RVSY7QM30EHTKV.uasset new file mode 100644 index 0000000..160adb5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/1I/93DDS3U8RVSY7QM30EHTKV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b06e37d5102415b2c771de775584c4b334673ecfe25c02a942a9102bb26866d7 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/91/0Q4R1IE3K2BYJSXIZOQ0QP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/91/0Q4R1IE3K2BYJSXIZOQ0QP.uasset new file mode 100644 index 0000000..00bbb56 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/91/0Q4R1IE3K2BYJSXIZOQ0QP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5d1dc6f70219856a74107499348c0c3ce0d52589185d58f297cfbbb28380137 +size 4457 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/BA/DGFPSX4DTSKSZQ36SD1Y3K.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/BA/DGFPSX4DTSKSZQ36SD1Y3K.uasset new file mode 100644 index 0000000..35f3a10 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/BA/DGFPSX4DTSKSZQ36SD1Y3K.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3259366c2410850aa33ebcd510c9c2c058f59a358a9c4a521eb813cbb8d59cd +size 4453 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/CT/GLPCUDYPOA417QPFT25J2M.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/CT/GLPCUDYPOA417QPFT25J2M.uasset new file mode 100644 index 0000000..9f131c8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/CT/GLPCUDYPOA417QPFT25J2M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6f8412bf4b2631fbc26ffba1d78bc7727aae32bbfeb6ebde017d8c593baba6d +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/D1/PJ7PHXS1Q9YT4RRK8ASA17.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/D1/PJ7PHXS1Q9YT4RRK8ASA17.uasset new file mode 100644 index 0000000..317fb62 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/D1/PJ7PHXS1Q9YT4RRK8ASA17.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e6b95b4d7127a977532738e43d008c3e353802bd945d6cd45090350299c5cd0 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/DP/15D95A5TUVKKEPBC5Z3V0K.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/DP/15D95A5TUVKKEPBC5Z3V0K.uasset new file mode 100644 index 0000000..a9d5bc4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/DP/15D95A5TUVKKEPBC5Z3V0K.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fae6534ddc2f9d9304f5b31104785c18e3ca10263156e8beae622e031b7aed1f +size 4350 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/IL/XNME8P2GEX8RVJYJ5AS9L9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/IL/XNME8P2GEX8RVJYJ5AS9L9.uasset new file mode 100644 index 0000000..f5e2e4c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/IL/XNME8P2GEX8RVJYJ5AS9L9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48fe8982b7678c5893f1734f86a2cde2d814eb9970f9b5501a9e3f220ff95b83 +size 4339 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/PQ/PI85JOOOY2R6IWIS0B5ZV5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/PQ/PI85JOOOY2R6IWIS0B5ZV5.uasset new file mode 100644 index 0000000..7325714 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/PQ/PI85JOOOY2R6IWIS0B5ZV5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:004a67b30ac3fb3c0e50af709159542abf79c269f2bc8fa3f02a6bef1757f4cc +size 4339 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/VB/DD4B02GSXHYDFMAB03BUYE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/VB/DD4B02GSXHYDFMAB03BUYE.uasset new file mode 100644 index 0000000..c4d95da --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/5/VB/DD4B02GSXHYDFMAB03BUYE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cfab114193b66ff434513de3f00748f92c2d08c1e851326548bea67038b0342 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/3U/Y7SCQAHPSUVVCZQCNEIKCJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/3U/Y7SCQAHPSUVVCZQCNEIKCJ.uasset new file mode 100644 index 0000000..4ebcf82 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/3U/Y7SCQAHPSUVVCZQCNEIKCJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfe1e31d7537237bcba86532eb55adf56729f909652308cdcd8c7997e203c95e +size 4162 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/7U/KFRJ8G1ZYZHNS4N6S74ZMY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/7U/KFRJ8G1ZYZHNS4N6S74ZMY.uasset new file mode 100644 index 0000000..076ca8b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/7U/KFRJ8G1ZYZHNS4N6S74ZMY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d62fce03349568128d30000365c656057b1e15551dfeef83eabd9b8cdf2f657c +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/8P/A5XH9J5QDNE58G2EZQY8EN.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/8P/A5XH9J5QDNE58G2EZQY8EN.uasset new file mode 100644 index 0000000..eb2fc8a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/8P/A5XH9J5QDNE58G2EZQY8EN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e745d5782ee0c3b71abf6f805b2a9a8bde2ea06c330b37d828f6af679fcb58e2 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/9G/2YEWP1NRKUKTW7IS6S8YM5.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/9G/2YEWP1NRKUKTW7IS6S8YM5.uasset new file mode 100644 index 0000000..4563d60 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/9G/2YEWP1NRKUKTW7IS6S8YM5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a756afd5af6fba0b92732c1ee0ecd7408e6fd52f659da29308e3ce9e0775a37 +size 12554 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/FD/BLYOF7Y0BIG7Q9IEJJVLIJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/FD/BLYOF7Y0BIG7Q9IEJJVLIJ.uasset new file mode 100644 index 0000000..2bf39cb --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/FD/BLYOF7Y0BIG7Q9IEJJVLIJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8efdc4e1a88d11fe95e404b9c095dd217310c0b35b99c14410aa2a0594ce0b1 +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/IR/DGTM6Z6X9MUIW1R1RM6HEM.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/IR/DGTM6Z6X9MUIW1R1RM6HEM.uasset new file mode 100644 index 0000000..45dc4bb --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/IR/DGTM6Z6X9MUIW1R1RM6HEM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c97d9f89b51ae304d39f59df865b0f0cce06c6bbfe85cd7c8ccad8acb57f12f +size 4166 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/KW/DIOBPSCU4ASCOKUXZZGYBP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/KW/DIOBPSCU4ASCOKUXZZGYBP.uasset new file mode 100644 index 0000000..906bdbf --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/KW/DIOBPSCU4ASCOKUXZZGYBP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea530c7a7cf435d4ad828088fdef87381c88679175c40489d2707873150b9612 +size 4367 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/MR/CIPUCZLV4PC998H04BXE50.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/MR/CIPUCZLV4PC998H04BXE50.uasset new file mode 100644 index 0000000..09f807a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/MR/CIPUCZLV4PC998H04BXE50.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:022e97772cdc6da2cd2bb12e1a296ddf1997c456ffb84fc9aa773274dd5b5d64 +size 4537 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/UN/V2FXYCRO8TWCQFEW9S7ONL.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/UN/V2FXYCRO8TWCQFEW9S7ONL.uasset new file mode 100644 index 0000000..0133234 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/UN/V2FXYCRO8TWCQFEW9S7ONL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f46fab81e53be528e4e3e759218f40a3f0103bcf9c0f803987cfd695f4c02e3 +size 4604 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/V3/KTE510QWYNYYC5GPCZILN2.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/V3/KTE510QWYNYYC5GPCZILN2.uasset new file mode 100644 index 0000000..424d314 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/6/V3/KTE510QWYNYYC5GPCZILN2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:755463710b58d7ac6f171539b279cec9d3a257302580e16ca608dbad1d6a9195 +size 4354 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/2L/43POZNB1OZZ0WC9OQQWP32.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/2L/43POZNB1OZZ0WC9OQQWP32.uasset new file mode 100644 index 0000000..2529911 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/2L/43POZNB1OZZ0WC9OQQWP32.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac837fcafb2b4891f9f80a59f25714f5d4bbf82ab8e92e640b9b99163cf78742 +size 4475 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/7N/IHKH3QKKSO2BH68HLQE5HW.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/7N/IHKH3QKKSO2BH68HLQE5HW.uasset new file mode 100644 index 0000000..cdaef54 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/7N/IHKH3QKKSO2BH68HLQE5HW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c21261a23321ba55d188ba87e02dea14e20d742efe6470a008c7730f708be4f +size 4468 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/FF/SREIGLJND5CE6ZHB6ORFDA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/FF/SREIGLJND5CE6ZHB6ORFDA.uasset new file mode 100644 index 0000000..aec90ef --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/FF/SREIGLJND5CE6ZHB6ORFDA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:663a034e191ccc38308f81e3af6b9ce4c787bb981ec38d9b9ba038e7052ac626 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/HC/DMJ0WZMFEPSSU5KV3I06DY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/HC/DMJ0WZMFEPSSU5KV3I06DY.uasset new file mode 100644 index 0000000..f5a78f2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/HC/DMJ0WZMFEPSSU5KV3I06DY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4b713c6ccb6db05b9e1b46b8f7776108ce72896b5426697eac47c614735c609 +size 4604 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/I3/2DFXQK7NBEGYK26EMWYIAI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/I3/2DFXQK7NBEGYK26EMWYIAI.uasset new file mode 100644 index 0000000..7273b6e --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/I3/2DFXQK7NBEGYK26EMWYIAI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6eb79bc218cac2f7e3a0abe38f05b13775b3ceb35543ea2efaf52af0f924e5fe +size 4537 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/KT/1DMK92SYFO52BCWH7YW6X1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/KT/1DMK92SYFO52BCWH7YW6X1.uasset new file mode 100644 index 0000000..a405c5b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/KT/1DMK92SYFO52BCWH7YW6X1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a12581e4ad6f3a22c885706fac70d294a609bce9c8d42ad790fc292d6481910 +size 4453 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/MJ/5XX5M6PJ0MHJDUL7W6DYUJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/MJ/5XX5M6PJ0MHJDUL7W6DYUJ.uasset new file mode 100644 index 0000000..88642ce --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/MJ/5XX5M6PJ0MHJDUL7W6DYUJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93376d6170e8ba6263a11b64eff5bb788e5aecd25eb0b8f5ec8ddd2bc9022bfc +size 4174 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/WH/A20YQ6G8GBT085UFJFYOFD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/WH/A20YQ6G8GBT085UFJFYOFD.uasset new file mode 100644 index 0000000..fd735d0 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/WH/A20YQ6G8GBT085UFJFYOFD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9b71d918966f2178579602cc3fafa2b984d1679f2e1e994d227d4fb1e5abee8 +size 4256 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/XH/NCZ6KTAN4JPVHK2TB6KIWE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/XH/NCZ6KTAN4JPVHK2TB6KIWE.uasset new file mode 100644 index 0000000..12155a2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/7/XH/NCZ6KTAN4JPVHK2TB6KIWE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f210b4ae721efc6eaa9699ee90d781474095495dfcc022f9b0389a3914e9782 +size 4453 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/0Y/JZOJQOJ8LAMK8MRFA4Y2CN.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/0Y/JZOJQOJ8LAMK8MRFA4Y2CN.uasset new file mode 100644 index 0000000..c970e33 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/0Y/JZOJQOJ8LAMK8MRFA4Y2CN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c0f078bf118d83d7e9cddf143e9910b4b599f382465a473357d85e8be8dd101 +size 4468 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/16/M2H1K5CDOD4X9UOOKN3G2R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/16/M2H1K5CDOD4X9UOOKN3G2R.uasset new file mode 100644 index 0000000..b88e213 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/16/M2H1K5CDOD4X9UOOKN3G2R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:289d9606b85ac5daab3bceb3c36f6b43bec0ffe4d528366d4c6693fc5fc8ade0 +size 4454 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/2U/XD95IMXOS47D6E9UJR2SNJ.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/2U/XD95IMXOS47D6E9UJR2SNJ.uasset new file mode 100644 index 0000000..4f8c423 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/2U/XD95IMXOS47D6E9UJR2SNJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa75dc9853e9ef9d403426c82d51c5d8e5efc52dbfab20a379365d306aecfa4e +size 4166 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/5K/WT2N6PIFH19MI313NH2V8D.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/5K/WT2N6PIFH19MI313NH2V8D.uasset new file mode 100644 index 0000000..354af58 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/5K/WT2N6PIFH19MI313NH2V8D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:632f98698568e4748afb7ab2833b7cd19648762b8fedf23f6dd2319c92671502 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6P/E9NE3R4WWBFLO7DM3YVJ25.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6P/E9NE3R4WWBFLO7DM3YVJ25.uasset new file mode 100644 index 0000000..56907c2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6P/E9NE3R4WWBFLO7DM3YVJ25.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55510880bb847a7c0dbceff5c9c0f31518fad79b0daeb5468c3cb302eb266420 +size 4351 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6U/9N30SLQBL4GCYWZAABJERE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6U/9N30SLQBL4GCYWZAABJERE.uasset new file mode 100644 index 0000000..d7b1e37 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/6U/9N30SLQBL4GCYWZAABJERE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f68888f8d86b7e1f2a8dc09f373a9595e17acd19c5fd3d83ec557b0febf1cafc +size 4348 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/7K/H1IDQB3F7XR0G6D56GBMU6.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/7K/H1IDQB3F7XR0G6D56GBMU6.uasset new file mode 100644 index 0000000..30b1ba4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/7K/H1IDQB3F7XR0G6D56GBMU6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6ba64de045eeb6d95ea0bb2f3e4369a468d1f070f77562fba937849c882fb8b +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/AJ/XJF07VB8ISEFI4M87N4CXF.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/AJ/XJF07VB8ISEFI4M87N4CXF.uasset new file mode 100644 index 0000000..05c3ec3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/AJ/XJF07VB8ISEFI4M87N4CXF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a2bedae945ec58ce5f557e74d07ffb2815caa435693e502086307158a0ba39b +size 4506 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/DH/OC6G68ED5VJZVW8EJQA76B.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/DH/OC6G68ED5VJZVW8EJQA76B.uasset new file mode 100644 index 0000000..0bc47ec --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/DH/OC6G68ED5VJZVW8EJQA76B.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:860094d11cfde31c0ee5cfac341fc3b25f577b6f59a9a984aaf779e6ed4d7198 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/GN/DIDACECEDK7DQHGSZF35H6.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/GN/DIDACECEDK7DQHGSZF35H6.uasset new file mode 100644 index 0000000..8d858af --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/GN/DIDACECEDK7DQHGSZF35H6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3de160eaa55412bb4743335b2cd4b66f744e607a0123fc6b38779f381cb3405f +size 4529 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/HS/R85DVK392RC4R0J9AJJSDX.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/HS/R85DVK392RC4R0J9AJJSDX.uasset new file mode 100644 index 0000000..ac09868 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/HS/R85DVK392RC4R0J9AJJSDX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:807b6c244ee8f5910e94e26ed60c1d08f36811bd0e3fda73844a34b3e7d0e2af +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/L1/PNG8TF54EI2EAW897D3V0R.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/L1/PNG8TF54EI2EAW897D3V0R.uasset new file mode 100644 index 0000000..b848725 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/L1/PNG8TF54EI2EAW897D3V0R.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ce728927b24f8d1ce01e649023dd2a3fe05f93e8cbce5ab5e9cde81216387d0 +size 4514 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/LP/95YG2KJ4S2ZT9TNGF4O1UA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/LP/95YG2KJ4S2ZT9TNGF4O1UA.uasset new file mode 100644 index 0000000..b4994c9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/LP/95YG2KJ4S2ZT9TNGF4O1UA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e43730690e370e8b4c09466ddcb59f022da458099e1ad391b3e0a5f983280604 +size 4715 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/NQ/B9RELJCTYQ8L9Y6YSJCZIA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/NQ/B9RELJCTYQ8L9Y6YSJCZIA.uasset new file mode 100644 index 0000000..c2cc6a0 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/NQ/B9RELJCTYQ8L9Y6YSJCZIA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bae332150afb6c696e6aac3d529f9ae5bafdbb6d57d7fa2de92128293e009b54 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/XL/7MKLADN1ZTTQ9FPVTBJGUD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/XL/7MKLADN1ZTTQ9FPVTBJGUD.uasset new file mode 100644 index 0000000..550f5e2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/8/XL/7MKLADN1ZTTQ9FPVTBJGUD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea413b0679b69b7042648ae957f7f4b99feb9c3cdabd7724a991e5e06bdba831 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/1I/FU34616O1QKKFXMD67EPG7.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/1I/FU34616O1QKKFXMD67EPG7.uasset new file mode 100644 index 0000000..b3921fc --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/1I/FU34616O1QKKFXMD67EPG7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f489627a584a7903a3d1223165fd4678a6dc2a99f2481b5b7e5d5698567adc33 +size 4604 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/2Z/K9Y7T981NPFQB0F0ODWMT7.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/2Z/K9Y7T981NPFQB0F0ODWMT7.uasset new file mode 100644 index 0000000..6c52cb5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/2Z/K9Y7T981NPFQB0F0ODWMT7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c1ae0fd34c8e0f27e19b0da935340c0b5c9529a4fcda53957ea43ea63594676 +size 4512 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/40/03OMEJKEKXOLMSAJLN6AF0.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/40/03OMEJKEKXOLMSAJLN6AF0.uasset new file mode 100644 index 0000000..c06b67e --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/40/03OMEJKEKXOLMSAJLN6AF0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca89fddcd8bd443063f4845512a8470e6bc1f85880f5c4e3b174777118b128d8 +size 4359 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/91/EMMTW3081FS3SV7WH9BV88.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/91/EMMTW3081FS3SV7WH9BV88.uasset new file mode 100644 index 0000000..5f77bfd --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/91/EMMTW3081FS3SV7WH9BV88.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fca02d66e3087c70af0bed1a1674ffccef9665013e0c41c2c6d9232111b20b1f +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/DQ/SBFD5M675LVD68N22SGIWH.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/DQ/SBFD5M675LVD68N22SGIWH.uasset new file mode 100644 index 0000000..d4eebf4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/DQ/SBFD5M675LVD68N22SGIWH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fab0a7eaacdcc6164e82e328f89d4f60b953fefde187886c5f1f3bef7bcfc3b0 +size 4544 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HL/KDU8U69V1XMLLWEBDOOFTK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HL/KDU8U69V1XMLLWEBDOOFTK.uasset new file mode 100644 index 0000000..cb33920 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HL/KDU8U69V1XMLLWEBDOOFTK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16d824bdf0f9438e7c4703d22729fcd4ddd600bb6a37aeaf025ede0cca0b5f3b +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HU/PMPASKH2GKH319Q1CFMPRM.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HU/PMPASKH2GKH319Q1CFMPRM.uasset new file mode 100644 index 0000000..d566274 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/HU/PMPASKH2GKH319Q1CFMPRM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:762c001c4df09d059eb64f4a4fcd824370f94f4beb9b830008f2c24e1acbbcc9 +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/IO/VM3C7C9TQPPAFFJU31MCU7.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/IO/VM3C7C9TQPPAFFJU31MCU7.uasset new file mode 100644 index 0000000..a19e581 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/IO/VM3C7C9TQPPAFFJU31MCU7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0424e7dcb62507c398e3bcbfac175811e4665520d4cdd8b4d0fa5edbab4c3fea +size 4211 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/JR/THXBS4Q7NOST3UFAAZK5R4.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/JR/THXBS4Q7NOST3UFAAZK5R4.uasset new file mode 100644 index 0000000..c18716a --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/JR/THXBS4Q7NOST3UFAAZK5R4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49559ff4357c229e17a47dbc962c1ef1bb7be46e79a7572a14e494f2ec70519c +size 4174 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UW/FS31A2FNT9GW4YINH4S00F.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UW/FS31A2FNT9GW4YINH4S00F.uasset new file mode 100644 index 0000000..1af63c9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UW/FS31A2FNT9GW4YINH4S00F.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0904b18841316432597cd8530f623bcd99a507735ffbd87ff7fe514b1e79da26 +size 4363 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UZ/8KR57T843NS9S301MPFH8D.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UZ/8KR57T843NS9S301MPFH8D.uasset new file mode 100644 index 0000000..6d52ef3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/9/UZ/8KR57T843NS9S301MPFH8D.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f99a3152afa5f71a9d51577d5acc50a503f676f57a9af505329f553f9669472 +size 4339 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/37/3MDT8UZULS2IQMUIAZMQYT.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/37/3MDT8UZULS2IQMUIAZMQYT.uasset new file mode 100644 index 0000000..a026a65 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/37/3MDT8UZULS2IQMUIAZMQYT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3796556c3d605d77c58767dc46634fe376378690571b838d024e8c54f1d5b539 +size 4598 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/3T/LQOJ9BAH0TFG9BN6VMPR0L.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/3T/LQOJ9BAH0TFG9BN6VMPR0L.uasset new file mode 100644 index 0000000..3dcae26 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/3T/LQOJ9BAH0TFG9BN6VMPR0L.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd2732ffc6274b282bbc050d20c47e9d01405d121c4328f859bab36d50768963 +size 4346 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/AT/95NOG595COK8YO39FPAVPE.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/AT/95NOG595COK8YO39FPAVPE.uasset new file mode 100644 index 0000000..f3a9467 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/AT/95NOG595COK8YO39FPAVPE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b605e99b47604d662361942947a8c09a86e156c211fb6fd1da64313f9e135d8b +size 4537 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/HZ/SQLM1IFIPOBMEKJGJHIBDL.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/HZ/SQLM1IFIPOBMEKJGJHIBDL.uasset new file mode 100644 index 0000000..3d2e737 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/HZ/SQLM1IFIPOBMEKJGJHIBDL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd4b39625d6c6259470bac88f5695651a053d4d1b39ce46fabd644ba7717fe4d +size 4354 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/NT/1U3K1FIZFLZJD9JECG4J91.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/NT/1U3K1FIZFLZJD9JECG4J91.uasset new file mode 100644 index 0000000..1bc656b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/NT/1U3K1FIZFLZJD9JECG4J91.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b6065fe56b9656774bbe4381849416efeca5ee02d87ac536a2fa05f486fa242 +size 4339 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/P0/2315TBK297NP062364FRJK.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/P0/2315TBK297NP062364FRJK.uasset new file mode 100644 index 0000000..0794df9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/P0/2315TBK297NP062364FRJK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2681c6dc52c285cbee604d02e9f3790ccda46a9f778e133e53c583eaa18e79ca +size 4170 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/YE/8F6N6CWL3Z9YFWFCPBOABN.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/YE/8F6N6CWL3Z9YFWFCPBOABN.uasset new file mode 100644 index 0000000..0eb2ca3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/A/YE/8F6N6CWL3Z9YFWFCPBOABN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd75c6c0163498d2d29f219a50d59d405f08a033ba709ca50348d580037ee6af +size 4454 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/17/SDPBJ9K67UIPUP22ZH7864.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/17/SDPBJ9K67UIPUP22ZH7864.uasset new file mode 100644 index 0000000..49d2664 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/17/SDPBJ9K67UIPUP22ZH7864.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e446e85c11edcad1d069279886e7fb92722db3245329622de84935cdf2ecff7a +size 4359 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/4O/8WLC0J43A48EBWDDJ38YJD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/4O/8WLC0J43A48EBWDDJ38YJD.uasset new file mode 100644 index 0000000..b1c741f --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/4O/8WLC0J43A48EBWDDJ38YJD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:808b6129a517f75c14fd28133f75c3add0a845942982a16404fff14c7639c5bb +size 4168 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/76/E3AHN2FPNWBFJ2AQ6HVNOY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/76/E3AHN2FPNWBFJ2AQ6HVNOY.uasset new file mode 100644 index 0000000..7713846 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/76/E3AHN2FPNWBFJ2AQ6HVNOY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e2c297d14afc3f24794dbdec840bd36693e1b3ceac553c746c36c15c74b2ca9 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/BQ/Q372FLA8BD7JIG29PCYFWG.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/BQ/Q372FLA8BD7JIG29PCYFWG.uasset new file mode 100644 index 0000000..e6816f1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/BQ/Q372FLA8BD7JIG29PCYFWG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f94ecf449efbf862410dc3b617ae0e0743db3d877e9284a6aaf012a21b7f1a70 +size 4280 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/CT/CFSGXL14SGU01FPIMKSNE1.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/CT/CFSGXL14SGU01FPIMKSNE1.uasset new file mode 100644 index 0000000..208b212 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/CT/CFSGXL14SGU01FPIMKSNE1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a2f78daa8403592daeb5ef218370ea03c381160661c3dcd25e91cd72fd24699 +size 4340 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/DA/6DJ7HJ17WP8CD3I6ZY8HWI.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/DA/6DJ7HJ17WP8CD3I6ZY8HWI.uasset new file mode 100644 index 0000000..69aab30 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/DA/6DJ7HJ17WP8CD3I6ZY8HWI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c1e30189f7c9d180564f165fc8df1dad66bfc67a0869442f3ea8f17e5d5dfed +size 4604 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/EX/VH3KW6RCB7L4HSAXAZF3W3.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/EX/VH3KW6RCB7L4HSAXAZF3W3.uasset new file mode 100644 index 0000000..10ee152 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/EX/VH3KW6RCB7L4HSAXAZF3W3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da29602a15cbbf736c529e69016ad60290e97c30d52bd8c76d176b62c0467fe5 +size 4544 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/F7/KMRREMHTMPCZQOSLDYDJBS.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/F7/KMRREMHTMPCZQOSLDYDJBS.uasset new file mode 100644 index 0000000..d33035d --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/F7/KMRREMHTMPCZQOSLDYDJBS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f91f99879ebe586ef0563d19ff9931d4525638efc63e28e5af3ca7afc8eb156 +size 4512 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/NE/1IZ3B0QY64Q0RDP9NU2K6H.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/NE/1IZ3B0QY64Q0RDP9NU2K6H.uasset new file mode 100644 index 0000000..7d98e0e --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/NE/1IZ3B0QY64Q0RDP9NU2K6H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28c1031a9c8e3c3379cad0c8a8749d1f918037eb6350c04908ef9feda106e3e6 +size 4537 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/SG/ABBQVE4WS4Q8X6QBWDF841.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/SG/ABBQVE4WS4Q8X6QBWDF841.uasset new file mode 100644 index 0000000..5a77f81 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/SG/ABBQVE4WS4Q8X6QBWDF841.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16053250779af8a8b273d5c56be0753fcdea197044950d1bb9bdfdd1a929241a +size 4356 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/T3/BMIR1KVDQU7TPX80KNVG2T.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/T3/BMIR1KVDQU7TPX80KNVG2T.uasset new file mode 100644 index 0000000..9df1b79 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/B/T3/BMIR1KVDQU7TPX80KNVG2T.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80de081e2b7d51011a5105e51beed82d0e18dec17db96189144dd7ad6030942b +size 4997 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/2M/BKLMJXKFDR71PC1PWGUPPP.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/2M/BKLMJXKFDR71PC1PWGUPPP.uasset new file mode 100644 index 0000000..eed8832 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/2M/BKLMJXKFDR71PC1PWGUPPP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b58b4cccd58a8c31444662a1c1d6835a62f89736320f587dc820df20566f92a +size 4512 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/4T/2KL36DS4X1S0RM7I09CL33.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/4T/2KL36DS4X1S0RM7I09CL33.uasset new file mode 100644 index 0000000..74f4d10 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/4T/2KL36DS4X1S0RM7I09CL33.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd11c0d66f5796a9212a26523a938a39642c11ec61733d32acdc3d18c59e28fc +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/7M/BO9IX3WLRNCEHVRDDLEOWT.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/7M/BO9IX3WLRNCEHVRDDLEOWT.uasset new file mode 100644 index 0000000..8169465 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/7M/BO9IX3WLRNCEHVRDDLEOWT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:274ce7a679c9f124bfd2ad8b02dac53feffa2a84a1e856545fa4d8f927a474d8 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/8A/TJ8MW1WQ2KJOMU1L02L2YA.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/8A/TJ8MW1WQ2KJOMU1L02L2YA.uasset new file mode 100644 index 0000000..3a6f98b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/8A/TJ8MW1WQ2KJOMU1L02L2YA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a120c0e4eeb8ba093f2f53c455a9b0de6aedd4c42e0f3346161a14818e35a4d +size 3722 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/W1/4XPUEFSRF6IJ5DJVQ5HY2N.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/W1/4XPUEFSRF6IJ5DJVQ5HY2N.uasset new file mode 100644 index 0000000..14e9834 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/W1/4XPUEFSRF6IJ5DJVQ5HY2N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14d9cbff6bedd04f8085dc0f0dbc1fa649a182c2b84a526a051547b9a46a9242 +size 4476 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/YZ/BZJ174LKPK9P48T2FPZ2YD.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/YZ/BZJ174LKPK9P48T2FPZ2YD.uasset new file mode 100644 index 0000000..254b318 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/C/YZ/BZJ174LKPK9P48T2FPZ2YD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ebead2e5493efd9dfddfd93f41a6036add43ddf3b721204d7c6cc8b1f4d4923 +size 4230 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/24/8PNBMJZ6VELIPUADNB9KZY.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/24/8PNBMJZ6VELIPUADNB9KZY.uasset new file mode 100644 index 0000000..1ef6de9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/24/8PNBMJZ6VELIPUADNB9KZY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5a91aa99315a612db15d1ded608361ff5626e16c64949686c940bb2e26d5873 +size 3840 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/40/HCM80K2UTKQ44YIMIPPXS8.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/40/HCM80K2UTKQ44YIMIPPXS8.uasset new file mode 100644 index 0000000..35b47a1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/40/HCM80K2UTKQ44YIMIPPXS8.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a04c1754cbbc2ceff0befb277b96d5f0c141a753dd26afb1caf1eb2842ed7fa +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/EY/PINX4K2U7SAPH6WRJ4H1EL.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/EY/PINX4K2U7SAPH6WRJ4H1EL.uasset new file mode 100644 index 0000000..fef6e97 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/EY/PINX4K2U7SAPH6WRJ4H1EL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7b0fedbcf857ff12fcb8b8cf60cfac24e21ccd6082ed9f38fe2935a4517ac81 +size 4533 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/LA/T916UMOAT5N27HQFVX6WGS.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/LA/T916UMOAT5N27HQFVX6WGS.uasset new file mode 100644 index 0000000..2380ab9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/D/LA/T916UMOAT5N27HQFVX6WGS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5eadb66707abd63e5997dad4742623895d7063a9cca6e3b3c68514677173134 +size 4227 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/5L/5SHDOVHTHP7TGMLI05GVV9.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/5L/5SHDOVHTHP7TGMLI05GVV9.uasset new file mode 100644 index 0000000..d2f6f4b --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/5L/5SHDOVHTHP7TGMLI05GVV9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e34830fce43825c6acb5e98dc81db518d42e16dd7cb843ef3e26423fe29eff6 +size 5274 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/A5/G6EJWJRQ94MEJ6VYZQCH0P.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/A5/G6EJWJRQ94MEJ6VYZQCH0P.uasset new file mode 100644 index 0000000..a998d0c --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/A5/G6EJWJRQ94MEJ6VYZQCH0P.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:577b210cfb48907e223de8a335985090139cd3ee84e97bb774e1882559c4b13d +size 4355 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/KF/BM04659BFJO7X0DH4EGU2N.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/KF/BM04659BFJO7X0DH4EGU2N.uasset new file mode 100644 index 0000000..b8a69cf --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/KF/BM04659BFJO7X0DH4EGU2N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1360dce862e39df3dd056e88564f671e78f1e180ff1b7f9dcac819d7c1062455 +size 4288 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/L8/O2XSZ7TA8EZ3U0EH412XVT.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/L8/O2XSZ7TA8EZ3U0EH412XVT.uasset new file mode 100644 index 0000000..254f5b1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/E/L8/O2XSZ7TA8EZ3U0EH412XVT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:982c414e4ccee514f3a327a0bdac7088c17ae66a72db928f7c69a6915baeeaad +size 4346 diff --git a/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/F/4R/B8IQ24EUB55DKMWKFIM65C.uasset b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/F/4R/B8IQ24EUB55DKMWKFIM65C.uasset new file mode 100644 index 0000000..a686eac --- /dev/null +++ b/Content/__ExternalActors__/Variant_Platforming/Lvl_Platforming/F/4R/B8IQ24EUB55DKMWKFIM65C.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59c4ccea47969860ec6794d1ff087882fb72be83f2cd629451cc40dab664dcdf +size 4469 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/2I/G1MKF8NNQ54SREG7DDID6O.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/2I/G1MKF8NNQ54SREG7DDID6O.uasset new file mode 100644 index 0000000..7773732 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/2I/G1MKF8NNQ54SREG7DDID6O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29df9ed04843dc4a93f7214c0af6523a803a64d0bea5c55d98795cffce8be625 +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/51/C41HDKEQ2QWJHE8D8QL4TM.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/51/C41HDKEQ2QWJHE8D8QL4TM.uasset new file mode 100644 index 0000000..799fea6 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/51/C41HDKEQ2QWJHE8D8QL4TM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:464f524cc069360e6ca8d8e1311052ac2c92c82658c862eba61b255b9c445665 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/55/TSQ6SNX6TODA8EE8PEHVED.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/55/TSQ6SNX6TODA8EE8PEHVED.uasset new file mode 100644 index 0000000..230ee7b --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/55/TSQ6SNX6TODA8EE8PEHVED.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33d811fa5e93af44ad7d3bd1f2108fc67a8779217e6ad543ce316d2aef40a832 +size 4488 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/7N/X1VL3XUO4ZCPBN9ZEYXAU5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/7N/X1VL3XUO4ZCPBN9ZEYXAU5.uasset new file mode 100644 index 0000000..ff093c2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/7N/X1VL3XUO4ZCPBN9ZEYXAU5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ac1388c484a3b3d102ff67ffb57f43f1aa61f806696d73ef5c520a5f836f549 +size 4234 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/9X/ON50D9MMRRWCOF8MZCJLBN.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/9X/ON50D9MMRRWCOF8MZCJLBN.uasset new file mode 100644 index 0000000..beee5d5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/9X/ON50D9MMRRWCOF8MZCJLBN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84ad67283ae0a820d3e22277971bdc5550ebb44e5404df5efe6ba0c874943ced +size 4488 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/A0/QUB33CZ9GJSQCJ55A8O7SH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/A0/QUB33CZ9GJSQCJ55A8O7SH.uasset new file mode 100644 index 0000000..d4cc79c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/A0/QUB33CZ9GJSQCJ55A8O7SH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ec7d06a4c8e98c6a467f4527ab2f75ef10aa168f76671edcbf0e588dbd09ba1 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/CE/WO89H04O4WVY06P3ZDQZDY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/CE/WO89H04O4WVY06P3ZDQZDY.uasset new file mode 100644 index 0000000..abfd544 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/CE/WO89H04O4WVY06P3ZDQZDY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf76aebb2e76bfe079b32bc0c3f8aa9480140ae0b87b47f53b046a55c5ab9b9d +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/W4/K4XW5H58ZTIXYZPFEU59QY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/W4/K4XW5H58ZTIXYZPFEU59QY.uasset new file mode 100644 index 0000000..e8090aa --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/W4/K4XW5H58ZTIXYZPFEU59QY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70d54bc320a65e9d868559fd36d14bb6f0d852868ecf2d71d968e05b29cf9e31 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/XR/DKEGC1B4JI84Q6M99OFPAB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/XR/DKEGC1B4JI84Q6M99OFPAB.uasset new file mode 100644 index 0000000..a78dbff --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/XR/DKEGC1B4JI84Q6M99OFPAB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:172ab84456f4127902cf95bdee4fa3be0510b237076f46d92e3349a131ff94a1 +size 4423 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/YZ/8GP970C3DULJJRBDLJCCAT.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/YZ/8GP970C3DULJJRBDLJCCAT.uasset new file mode 100644 index 0000000..0957829 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/0/YZ/8GP970C3DULJJRBDLJCCAT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf2492540730a59ffe757c40cdb1a6ea54773798a0cae4d6a03178edcef230af +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/4L/QHE9SS8IL8NAH4LP40QVMA.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/4L/QHE9SS8IL8NAH4LP40QVMA.uasset new file mode 100644 index 0000000..bda4f89 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/4L/QHE9SS8IL8NAH4LP40QVMA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd5fd6ebe297f4a87e952f459c3c60d4128443e8ae98abc72fc43fabd167676e +size 4505 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/AS/7JLJ2FV98VA2GZXKO2SZQ3.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/AS/7JLJ2FV98VA2GZXKO2SZQ3.uasset new file mode 100644 index 0000000..1ba9a7f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/AS/7JLJ2FV98VA2GZXKO2SZQ3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77e8e6964f83a6f4d614d26f0ea1a02b37a094a4118ae8b2c07afa1382190ab4 +size 4423 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/DZ/I5IBC74KFACATJBFXLDCE0.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/DZ/I5IBC74KFACATJBFXLDCE0.uasset new file mode 100644 index 0000000..90813ba --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/DZ/I5IBC74KFACATJBFXLDCE0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c75bd1a28f7dd0df817dbf43b63e73344be89b29f46eb81eec990da5dafab21 +size 4554 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/MM/CNZCO2Y9UH51FLSXM49L4K.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/MM/CNZCO2Y9UH51FLSXM49L4K.uasset new file mode 100644 index 0000000..185a46a --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/1/MM/CNZCO2Y9UH51FLSXM49L4K.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:489114840ae14acbf022b665c2ed39b6b39cdd0397267e8cdb605ce21c3b9cad +size 4234 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/88/W3TC4XVD4B726DXP8IRN6K.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/88/W3TC4XVD4B726DXP8IRN6K.uasset new file mode 100644 index 0000000..4aba3ff --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/88/W3TC4XVD4B726DXP8IRN6K.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a207ed10ad38a391274aa86b8de013dced209729a007f4f8436a9f7f3010c89 +size 4558 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8N/FCX53BERRMEQY7OWO3KYO6.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8N/FCX53BERRMEQY7OWO3KYO6.uasset new file mode 100644 index 0000000..8412ed9 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8N/FCX53BERRMEQY7OWO3KYO6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8866ebc7f03ea6fe2b4cba599aa8a11f09e7b1b69df10e22fe3f65163be689a5 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8W/JCYX6FJ8GQ2IFZ7BNCK5RE.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8W/JCYX6FJ8GQ2IFZ7BNCK5RE.uasset new file mode 100644 index 0000000..c9fff15 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/8W/JCYX6FJ8GQ2IFZ7BNCK5RE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2daae48b515a2737cfdf060cc315389d4c5937e853ed8031a54cc6fadb68130 +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/BX/L4E2EQEA7T84XTQO1ANHJH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/BX/L4E2EQEA7T84XTQO1ANHJH.uasset new file mode 100644 index 0000000..e04fcb8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/BX/L4E2EQEA7T84XTQO1ANHJH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:961869124df46691c5600c4f89800ea3dcfa7e7c2d7de9882c5b3a763799252f +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/5OYUDWJJIFAH2U8EP29EZW.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/5OYUDWJJIFAH2U8EP29EZW.uasset new file mode 100644 index 0000000..5d8cf4e --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/5OYUDWJJIFAH2U8EP29EZW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c390ee8ba0e1512ba5f64665db64fd76ed8b3ba0e15ef3fb7b59c60acf0d7e2 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/HKCCLAZQSUEJZG9QCZ6C0O.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/HKCCLAZQSUEJZG9QCZ6C0O.uasset new file mode 100644 index 0000000..7af4518 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/QN/HKCCLAZQSUEJZG9QCZ6C0O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a382863d1c65768b4b8356b3a1e566459583a27efe1dcce5e90868ca17307320 +size 4381 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/TS/G8WTY9XQQX37L3VIWLTMJU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/TS/G8WTY9XQQX37L3VIWLTMJU.uasset new file mode 100644 index 0000000..9e2d11c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/TS/G8WTY9XQQX37L3VIWLTMJU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3edfc78d1b2645df7b8edc48060951fdd81fe14e733e631b31a90c6ab616b763 +size 4440 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/UF/U3AV1VA4PKPVMO06KMZSD1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/UF/U3AV1VA4PKPVMO06KMZSD1.uasset new file mode 100644 index 0000000..bd8842f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/UF/U3AV1VA4PKPVMO06KMZSD1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eca2906ad01e4caf862ff99729174209b56c01dab13a6d439931adb97b975f2b +size 4575 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WS/OVOQ7FE1IFTPQISWGSWKVC.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WS/OVOQ7FE1IFTPQISWGSWKVC.uasset new file mode 100644 index 0000000..784be8f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WS/OVOQ7FE1IFTPQISWGSWKVC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c279f6510c350686c342096f7cbeca8f4eb818f6725f7c11aae8a31f6d8e4ad6 +size 4234 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WV/IGCDSH3F4Y0RC8SENYM91Z.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WV/IGCDSH3F4Y0RC8SENYM91Z.uasset new file mode 100644 index 0000000..052a071 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/2/WV/IGCDSH3F4Y0RC8SENYM91Z.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d58fd55f2d6f823b28aa9565b683aadee266a4021f4365071501ae7529a81205 +size 2300 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/5S/82ZBWG53S08ZU6XJ2ZSBBE.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/5S/82ZBWG53S08ZU6XJ2ZSBBE.uasset new file mode 100644 index 0000000..549c4cb --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/5S/82ZBWG53S08ZU6XJ2ZSBBE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e8496440bd27a23cace7134202126f352a3bf43afe5cfd689692d57da1bbf5a +size 12122 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/GX/6EOALX5Y5HFRQJAGOS1QT7.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/GX/6EOALX5Y5HFRQJAGOS1QT7.uasset new file mode 100644 index 0000000..60ab4e2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/GX/6EOALX5Y5HFRQJAGOS1QT7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79de19ad4249738565d1ea0a1016ab464edd2253c387416dc6dd8ac569711f66 +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/LI/I3R0J0JY12SLX2CUDGPK14.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/LI/I3R0J0JY12SLX2CUDGPK14.uasset new file mode 100644 index 0000000..cb6baea --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/LI/I3R0J0JY12SLX2CUDGPK14.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:928579c9bc619c389831edd60bc3e7729b3024eb07455b129bb0657295dd67dc +size 4731 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/V1/D800HGD5TR8TIRIXI0DPZO.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/V1/D800HGD5TR8TIRIXI0DPZO.uasset new file mode 100644 index 0000000..6651f68 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/3/V1/D800HGD5TR8TIRIXI0DPZO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07893d071d15dabfa23328239b2eba96b397e51afac1948f27332c5744820c8a +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/2O/7LLF6A9TYTLPVE3CJBMHZW.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/2O/7LLF6A9TYTLPVE3CJBMHZW.uasset new file mode 100644 index 0000000..02d7110 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/2O/7LLF6A9TYTLPVE3CJBMHZW.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d4baa67c772fbd3a76e919ea4bcad73dbafdec23dc1714012d1f6c9057214c6 +size 12236 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/5P/6P8DZN6JS5T15S43S4A4Q9.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/5P/6P8DZN6JS5T15S43S4A4Q9.uasset new file mode 100644 index 0000000..25d40e0 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/5P/6P8DZN6JS5T15S43S4A4Q9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11b95b29c50b89dde6e8b02d3356f0e2a73c9e5f0dd296eba2ec6cc5fbc2b942 +size 4364 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/AO/V40S5T2E6I4T2O6BBNUR38.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/AO/V40S5T2E6I4T2O6BBNUR38.uasset new file mode 100644 index 0000000..40b0caf --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/AO/V40S5T2E6I4T2O6BBNUR38.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fd2b453e6316b8dd29f0cf3ed8f3ea7282a2ca5985d73fd7a81878220a5c00c +size 4438 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/DJ/F3N5KA328H6KPE36KJLFHV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/DJ/F3N5KA328H6KPE36KJLFHV.uasset new file mode 100644 index 0000000..741cb00 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/DJ/F3N5KA328H6KPE36KJLFHV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5356a1fef03af10085b9c968bd1f96aa4f3d14ec9301579a6a76306902b4419 +size 3812 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FE/C6BJR38GS6H4J2SPT0XRZG.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FE/C6BJR38GS6H4J2SPT0XRZG.uasset new file mode 100644 index 0000000..39864d4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FE/C6BJR38GS6H4J2SPT0XRZG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c30bcdf59135a14a584d18d5f925f055565b585aabcadd7283402e213a1b6463 +size 4517 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FI/PYW5E1IVFV8U5TT2WHQGHB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FI/PYW5E1IVFV8U5TT2WHQGHB.uasset new file mode 100644 index 0000000..63ed822 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/FI/PYW5E1IVFV8U5TT2WHQGHB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c66a110e2e059f20cd226e18717a7aff50ea70d8dfdc3735d8bfe488230b09c +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/S1/V1WOSCNF9Z5E74HYU3V5O1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/S1/V1WOSCNF9Z5E74HYU3V5O1.uasset new file mode 100644 index 0000000..3144e9c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/S1/V1WOSCNF9Z5E74HYU3V5O1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49c1e110244c1102685d3fb75f0190b241217ccab700ba7dccc46279f2f99922 +size 4521 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/SR/O49WBYGCZC2E5STYR76FC4.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/SR/O49WBYGCZC2E5STYR76FC4.uasset new file mode 100644 index 0000000..d0102dc --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/SR/O49WBYGCZC2E5STYR76FC4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f5a5001a10fbf2650e795b51ea3783dd9d0c3b87d26cf55239b1a088f0d0929 +size 4535 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/X1/0K1YU00713QQLQPVSUR3IP.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/X1/0K1YU00713QQLQPVSUR3IP.uasset new file mode 100644 index 0000000..0c1a9ca --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/4/X1/0K1YU00713QQLQPVSUR3IP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03f03208485e60aef57f1f025534dab20e51715ab1610334ce6bfce168421ade +size 4617 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/1I/2S73Q6F8UM0GUJ5FUTYL7X.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/1I/2S73Q6F8UM0GUJ5FUTYL7X.uasset new file mode 100644 index 0000000..ee4523b --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/1I/2S73Q6F8UM0GUJ5FUTYL7X.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04262f725480361a009816582335429468835fed41a6e70c61cda9bcb028c6c0 +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/AN/JLMHPKUN9Z5WTQYDGYP142.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/AN/JLMHPKUN9Z5WTQYDGYP142.uasset new file mode 100644 index 0000000..05d6d0d --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/AN/JLMHPKUN9Z5WTQYDGYP142.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab32587f85733e9136f704c0ce04837ec7eccf1b718c3ec515d9cf25c98523ec +size 4444 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/BN/36TXURCS5J98HU9ZZ79V1Z.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/BN/36TXURCS5J98HU9ZZ79V1Z.uasset new file mode 100644 index 0000000..21274c8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/BN/36TXURCS5J98HU9ZZ79V1Z.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cdefa271c88a643c7b719a2f6f488e4dcc4566eb4bbfe8f43cfd19d10ac4174 +size 4505 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/CY/E7V6YSUV6ZU1RENFIG0S6N.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/CY/E7V6YSUV6ZU1RENFIG0S6N.uasset new file mode 100644 index 0000000..8c4004e --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/CY/E7V6YSUV6ZU1RENFIG0S6N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81c8cda87069594c3ea5b17cb7415c5d3f67a2ef896f94e34aaeacec7aef785a +size 4788 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/R7/QBO2ZHXPF79ZYF4GINGLIF.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/R7/QBO2ZHXPF79ZYF4GINGLIF.uasset new file mode 100644 index 0000000..8b1b094 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/R7/QBO2ZHXPF79ZYF4GINGLIF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99d8ada1a574fdc2102b649a7c8c32f1c9d711b4f03be2094c31d73a0545e783 +size 5617 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/RK/SCE75WXEPFZ9ERSYYKKE4A.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/RK/SCE75WXEPFZ9ERSYYKKE4A.uasset new file mode 100644 index 0000000..9fa0931 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/5/RK/SCE75WXEPFZ9ERSYYKKE4A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f195803dfd192c3d973ade400f152ff693f69e809cc6fbd467492f5a4f01d740 +size 3935 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/7N/V8LHYHOZ8T4E0JW1UI8HNH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/7N/V8LHYHOZ8T4E0JW1UI8HNH.uasset new file mode 100644 index 0000000..902419a --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/7N/V8LHYHOZ8T4E0JW1UI8HNH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff66446abf3229e176a7c423893ea5a1cfcb7c8c9775bbcee53fde5e5ea40246 +size 4438 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/G4/6HOLR0R7EDXS2QUKSQ79J7.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/G4/6HOLR0R7EDXS2QUKSQ79J7.uasset new file mode 100644 index 0000000..b09e142 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/G4/6HOLR0R7EDXS2QUKSQ79J7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7d34b27cf248ed6b327666af47fe57585725ed654440308f295e73333ff2af3 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Y7/WUY3BJM0HMIJDZ6ORO6KDY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Y7/WUY3BJM0HMIJDZ6ORO6KDY.uasset new file mode 100644 index 0000000..812f6c2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Y7/WUY3BJM0HMIJDZ6ORO6KDY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e597b6de271b15796c393fc4ad18cedb7df59ba152227ab6c3afaeea749311 +size 4505 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Z6/A3HQCHNAI3O4WPJZEB47V3.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Z6/A3HQCHNAI3O4WPJZEB47V3.uasset new file mode 100644 index 0000000..a73e7f1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/Z6/A3HQCHNAI3O4WPJZEB47V3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d672c098b51275f300560e1a3c41bc8319e70f0ac2951443ba5d73e19155be4 +size 4633 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/ZZ/JNWPBGUXXO50Z8FMT2C8FK.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/ZZ/JNWPBGUXXO50Z8FMT2C8FK.uasset new file mode 100644 index 0000000..7931fe4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/6/ZZ/JNWPBGUXXO50Z8FMT2C8FK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ae4975ad0e03cb049efe529c975f5c6c24a8ef336699d24a3e13aaa6fb25ccd +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/AC/GJKJDMBGHUD0VUN52G0BWX.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/AC/GJKJDMBGHUD0VUN52G0BWX.uasset new file mode 100644 index 0000000..60ed9ec --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/AC/GJKJDMBGHUD0VUN52G0BWX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdde08f2298faf920e3f0096826214f2ef24bf95d223e59dc8ef8b4abd404371 +size 4329 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FI/VOZOS1IVPW2M97OAXQCQV1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FI/VOZOS1IVPW2M97OAXQCQV1.uasset new file mode 100644 index 0000000..d60c884 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FI/VOZOS1IVPW2M97OAXQCQV1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d1be96285ba65fce62cf07ee6a051b75c300ed07580058b9a2663c5785d7498 +size 4521 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FU/ESKEUK3PO4RFJ7DNJHE95H.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FU/ESKEUK3PO4RFJ7DNJHE95H.uasset new file mode 100644 index 0000000..a123b41 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FU/ESKEUK3PO4RFJ7DNJHE95H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3e0fc9b9bf7ba63dee258c47d1ec077e5a327f5e1a2cb9be7d6006eb3ad051d +size 4387 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FZ/TAY0RTVT1I4LEADPG4DMCL.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FZ/TAY0RTVT1I4LEADPG4DMCL.uasset new file mode 100644 index 0000000..52fa73c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/FZ/TAY0RTVT1I4LEADPG4DMCL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9846b9dd76e5500a72cc34350cd759fcdc3e892b04b0a9b519bf8bf01b85957a +size 4633 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/HG/KNVV0PKQUQGFMXEO4LEB5E.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/HG/KNVV0PKQUQGFMXEO4LEB5E.uasset new file mode 100644 index 0000000..2b42e60 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/HG/KNVV0PKQUQGFMXEO4LEB5E.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:524808ca63ff90012428237444f20b381e4836f41c83764d9f3b173c417b64d0 +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/OJ/3Z4PRDM96FA9PAAA5QN8T6.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/OJ/3Z4PRDM96FA9PAAA5QN8T6.uasset new file mode 100644 index 0000000..b666064 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/OJ/3Z4PRDM96FA9PAAA5QN8T6.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b19315b3438d50909635ba3b6d67b219ce5ce70e011b118064967bf2d73cdbfd +size 4504 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/Q9/VV1XAARCTH3S9KYJ70JU5U.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/Q9/VV1XAARCTH3S9KYJ70JU5U.uasset new file mode 100644 index 0000000..71ff50b --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/Q9/VV1XAARCTH3S9KYJ70JU5U.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af4180e86f6d8e98c1ef739c44373df0479590012246b1a1a51f3cea6660d761 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/RK/BFV42H3EZS6RTU76GYOY42.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/RK/BFV42H3EZS6RTU76GYOY42.uasset new file mode 100644 index 0000000..393eed5 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/RK/BFV42H3EZS6RTU76GYOY42.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87443e1a6acbc4164e53a54ad8610ee20457d8af9c2de93433bea47966d37009 +size 4387 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/TK/XOW2H2EFOJBB8E2LG4DQ3A.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/TK/XOW2H2EFOJBB8E2LG4DQ3A.uasset new file mode 100644 index 0000000..1e30b3d --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/TK/XOW2H2EFOJBB8E2LG4DQ3A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e7215c9e06c75f29b98ca1622a7a0977d58e9086b27dbd14187cadeea2655a0 +size 6596 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/VE/PAV8481ITARYRY3QDLFEJZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/VE/PAV8481ITARYRY3QDLFEJZ.uasset new file mode 100644 index 0000000..4de5e81 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/7/VE/PAV8481ITARYRY3QDLFEJZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b85c2ea116eee75da3e6f41588f41d29497be96fd589484d8b17d31193d92d8 +size 5517 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/0Y/JGIN2GJ35V3PEEV84HFVRV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/0Y/JGIN2GJ35V3PEEV84HFVRV.uasset new file mode 100644 index 0000000..78da6a3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/0Y/JGIN2GJ35V3PEEV84HFVRV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc7e4ca3ad17df36763e724453b0250a4ec610c2bd3e0d663ad63209bd939a41 +size 3994 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/BX/0TL7ZIIQQ5DC1IAX1XYJUZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/BX/0TL7ZIIQQ5DC1IAX1XYJUZ.uasset new file mode 100644 index 0000000..058ec44 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/BX/0TL7ZIIQQ5DC1IAX1XYJUZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7535f4fd56fedd64b9e4afcc9f8a72c49e37622c8b40cc7ee1b9bf7ca9302307 +size 8415 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/IY/E2HCOQGZZ81FQJZH0Q7EXB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/IY/E2HCOQGZZ81FQJZH0Q7EXB.uasset new file mode 100644 index 0000000..d8db060 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/IY/E2HCOQGZZ81FQJZH0Q7EXB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c69b76542841fb80a5b1a92d37478a5b50f59cb61a3aedb6f2619f94a3afb30 +size 4364 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/QR/0XN8O0QF52ZUXKOZG7BONA.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/QR/0XN8O0QF52ZUXKOZG7BONA.uasset new file mode 100644 index 0000000..81171b4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/QR/0XN8O0QF52ZUXKOZG7BONA.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86b3d0241bc96d2bbb0142f02e4621210eec98a0c590b4c7df677aff6b885af8 +size 4570 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/V3/20IIIADDF8349J2BKCJKT0.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/V3/20IIIADDF8349J2BKCJKT0.uasset new file mode 100644 index 0000000..a3ca21e --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/V3/20IIIADDF8349J2BKCJKT0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c546874cfdcdcd809ed2b73d0a526d025dfa6747d27f5d486e60be6b8ad6c770 +size 4650 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XQ/YVK1F3AJGN2OYUWBYE1175.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XQ/YVK1F3AJGN2OYUWBYE1175.uasset new file mode 100644 index 0000000..984a900 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XQ/YVK1F3AJGN2OYUWBYE1175.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21d37317797989cb03aa9daf934969dd7f31bbd07055e00eddf3321779ebf746 +size 5369 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XT/8U4LWVODG9CWTCW2RDG45N.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XT/8U4LWVODG9CWTCW2RDG45N.uasset new file mode 100644 index 0000000..81aba49 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/XT/8U4LWVODG9CWTCW2RDG45N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13ae426f44a4fdacb4a7725f198ef8bd4cb645ba3960e7f1ad201dee6865c7b2 +size 4441 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/ZO/DNU8CWFVEZ083S87RKPEZ9.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/ZO/DNU8CWFVEZ083S87RKPEZ9.uasset new file mode 100644 index 0000000..1eb97bc --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/8/ZO/DNU8CWFVEZ083S87RKPEZ9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8503111e05d0346d19e9445729a45e3e6dbea3b2aa676e8e7e28041744846b7e +size 4552 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/0H/L2OPHB6SDBCIRYW1FF8EBT.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/0H/L2OPHB6SDBCIRYW1FF8EBT.uasset new file mode 100644 index 0000000..2b1417c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/0H/L2OPHB6SDBCIRYW1FF8EBT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfed95c20b6b9e78fbae2a9ae5ee3c18427626e785fe1cca6b09ae3c40e24e20 +size 4732 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/EY/NKSPJALRCCOUADXCNJK3CL.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/EY/NKSPJALRCCOUADXCNJK3CL.uasset new file mode 100644 index 0000000..f4ddd0b --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/EY/NKSPJALRCCOUADXCNJK3CL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe06a90a00e074b668a105bcc14ee5f0a2a86d71829cf246cecd8670598ba8b +size 4465 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/FU/3SI6A5UVXA8UU40SO8PXBK.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/FU/3SI6A5UVXA8UU40SO8PXBK.uasset new file mode 100644 index 0000000..5ec6571 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/FU/3SI6A5UVXA8UU40SO8PXBK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59c5f4338d5630f7fbf53969bc33decd938afdc43ae46435e1dec07a012083bb +size 4465 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/IB/TU2042O8WCAXRXICLUU34I.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/IB/TU2042O8WCAXRXICLUU34I.uasset new file mode 100644 index 0000000..c84a04b --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/IB/TU2042O8WCAXRXICLUU34I.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:317b7610e883d28dd0719e617164cebbdc77def1f0368df6f7838266ddd3b65d +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/W1/Y1NMCVOYTP7IVRTZNVIOZN.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/W1/Y1NMCVOYTP7IVRTZNVIOZN.uasset new file mode 100644 index 0000000..2377fa2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/W1/Y1NMCVOYTP7IVRTZNVIOZN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2d2b1dcf9e53a1653875e864618229a00fdc859f76a552c8a5c1ca76be47286 +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/XD/B5ECBUW5KR3KQQF2K7SZ1E.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/XD/B5ECBUW5KR3KQQF2K7SZ1E.uasset new file mode 100644 index 0000000..7aaabfb --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/XD/B5ECBUW5KR3KQQF2K7SZ1E.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8335fbbdc993d063616b8d5edc9f57c4d110c2d75659818b1abd6e72a7708e6c +size 4786 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/ZQ/9WNDS1QQWL546BM4CI6BNZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/ZQ/9WNDS1QQWL546BM4CI6BNZ.uasset new file mode 100644 index 0000000..23417d1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/9/ZQ/9WNDS1QQWL546BM4CI6BNZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efe47ce59175fb14f5a68e0a0027237d6329f93e8cd89c8205994ce7d9cb5b78 +size 4351 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2J/LZETGQ3X85G5TSJ9FFXCA3.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2J/LZETGQ3X85G5TSJ9FFXCA3.uasset new file mode 100644 index 0000000..cff8f8f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2J/LZETGQ3X85G5TSJ9FFXCA3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47659cfc78a54985009ef32515ed6dfd427a42fbbd28f734ed89cdf60e8f2953 +size 4465 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2S/5B1U9FCQ8M5X53RHEQ6D5J.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2S/5B1U9FCQ8M5X53RHEQ6D5J.uasset new file mode 100644 index 0000000..38ab110 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/2S/5B1U9FCQ8M5X53RHEQ6D5J.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:034faee299bce0554428cd40fbdd5a2fb3a3b6f1d629be562b97c81088c47622 +size 2278 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/89/YLDOGE8ZIHHE1N8EWSSA5X.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/89/YLDOGE8ZIHHE1N8EWSSA5X.uasset new file mode 100644 index 0000000..9a4aa8f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/89/YLDOGE8ZIHHE1N8EWSSA5X.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07d5f6444b0714439aa0f2eb3ba46b13f83a93ac55c478594dfa37bf236061b1 +size 4505 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/I2/P09WK19412DF9S1OSOGA9N.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/I2/P09WK19412DF9S1OSOGA9N.uasset new file mode 100644 index 0000000..8fca3c6 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/I2/P09WK19412DF9S1OSOGA9N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:638d2b3543141d9c148785d0f62984f417c86b499551c97e884d01b50d4e92a5 +size 4619 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/MU/N60BGDPNX9NAECL7P3D62A.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/MU/N60BGDPNX9NAECL7P3D62A.uasset new file mode 100644 index 0000000..b693dd7 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/MU/N60BGDPNX9NAECL7P3D62A.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7e75d14a79aaa2a61c17e5c77b4314f03a581463ee92a641835c2324e1cc9fe +size 4498 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/QT/43H2JAMUR02W8525AAT31O.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/QT/43H2JAMUR02W8525AAT31O.uasset new file mode 100644 index 0000000..c47cb7c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/QT/43H2JAMUR02W8525AAT31O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f9362c0c604ba000feb466bb89fec1dd0a2504f513eaa03f1215b8e534363c +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/R0/PW2O8FXK76Q7QQP5HO12GT.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/R0/PW2O8FXK76Q7QQP5HO12GT.uasset new file mode 100644 index 0000000..38ef57a --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/R0/PW2O8FXK76Q7QQP5HO12GT.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfac5bec658e1e156c703a3a43d75f0b88862ad93074c9caf38b01a68669e65d +size 3644 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RH/6EAZC8A5PICQNUO92BCA8I.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RH/6EAZC8A5PICQNUO92BCA8I.uasset new file mode 100644 index 0000000..1a0edff --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RH/6EAZC8A5PICQNUO92BCA8I.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f516fda6dcc2a3434134505c1d51da3c07a6f2fafdce2ab2160cdd3025afba02 +size 4558 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RR/VFVX5TLBBD4APPS0WIVULU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RR/VFVX5TLBBD4APPS0WIVULU.uasset new file mode 100644 index 0000000..6dab1d3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/RR/VFVX5TLBBD4APPS0WIVULU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c33b67e8d7850d8ec20d53d1ae8dacbe98366a740625ac720a42fc8ff8cd8274 +size 4619 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/SR/9P30BPQ8QVJ0DC2NIS2OC5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/SR/9P30BPQ8QVJ0DC2NIS2OC5.uasset new file mode 100644 index 0000000..58685f8 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/SR/9P30BPQ8QVJ0DC2NIS2OC5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:204395bb21dc5362b640e11495b91ba59975c25b06c7a603dde05d1eb02a7879 +size 4606 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/TM/9JUSV7NLY7Q93ZKVXAUORV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/TM/9JUSV7NLY7Q93ZKVXAUORV.uasset new file mode 100644 index 0000000..0a405fa --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/A/TM/9JUSV7NLY7Q93ZKVXAUORV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aaaf756fd90bf9c926cdb9f318ea6e633c42a7e7f1a7731805c7ae776800a586 +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/0Q/K1MY2Z3PO44FGAHJOJSWRF.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/0Q/K1MY2Z3PO44FGAHJOJSWRF.uasset new file mode 100644 index 0000000..80ecb4f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/0Q/K1MY2Z3PO44FGAHJOJSWRF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39e4792660d3d94903d31a81eb740c487a4c3df32f16d36a7f653845f39c5ab2 +size 4553 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/4U/0JQULTZPZO65LXMOXJI8ZH.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/4U/0JQULTZPZO65LXMOXJI8ZH.uasset new file mode 100644 index 0000000..d309c2f --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/4U/0JQULTZPZO65LXMOXJI8ZH.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77714b0fe6deae899e1b617a92ec1bcca52b52e510112411b4b28f2acb3f8dd9 +size 4648 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/C4/G8J8FNL5D83NA6SN3RKUNP.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/C4/G8J8FNL5D83NA6SN3RKUNP.uasset new file mode 100644 index 0000000..39f3168 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/C4/G8J8FNL5D83NA6SN3RKUNP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18b98125391ff06d34bb69792cf21e8471ff8962cdf902e69055e9ec8d649458 +size 4731 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/DM/E5TLKD3GOGSELPM18VQESJ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/DM/E5TLKD3GOGSELPM18VQESJ.uasset new file mode 100644 index 0000000..eda3d23 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/DM/E5TLKD3GOGSELPM18VQESJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97533ed95d2c40288f7ded4b68f42b57605e4bd37141ad1d089e17b7cb377588 +size 6297 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/NS/E0F0PNC3IO8QSVU5LCI5I2.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/NS/E0F0PNC3IO8QSVU5LCI5I2.uasset new file mode 100644 index 0000000..26ea34a --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/NS/E0F0PNC3IO8QSVU5LCI5I2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b05cafe3d97e11bf6fb1cf9bf3de4600bcaa7dc2da984a5f101470ebbfa6af0d +size 4348 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/Q6/JDMX515ZGL66Y7Z28EI0RU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/Q6/JDMX515ZGL66Y7Z28EI0RU.uasset new file mode 100644 index 0000000..be8184b --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/Q6/JDMX515ZGL66Y7Z28EI0RU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f5d9be2e705e4b12fcc667b99975f336537681ee77007c98a961dad76070d38 +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/TT/YM92F6PM12D7710U2ZVWWY.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/TT/YM92F6PM12D7710U2ZVWWY.uasset new file mode 100644 index 0000000..9bc6c65 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/TT/YM92F6PM12D7710U2ZVWWY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8164320fa9ecc81ca87f5bfdf20f53bf8e3b6f992b53060731038db5210eed4f +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/UR/JZ7DT0ELPYBVDXM6L7TM0C.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/UR/JZ7DT0ELPYBVDXM6L7TM0C.uasset new file mode 100644 index 0000000..e885d30 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/B/UR/JZ7DT0ELPYBVDXM6L7TM0C.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d69035e96f6055ac3c29bf5b15ccea0eacfb1464bd23261758e660e7d645ada6 +size 6598 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/0L/CL3R603WDPFWJLMYLWZVZN.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/0L/CL3R603WDPFWJLMYLWZVZN.uasset new file mode 100644 index 0000000..8d21fd2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/0L/CL3R603WDPFWJLMYLWZVZN.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e93f456b1d4d18c4a554e44856d9275d9bf91bb3105eb4f18a3b6fbe9bab99cc +size 12653 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/5R/95TDOJQ9Z8E18ROGC7MIX7.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/5R/95TDOJQ9Z8E18ROGC7MIX7.uasset new file mode 100644 index 0000000..3842fe7 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/5R/95TDOJQ9Z8E18ROGC7MIX7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26b9aa840aa83c1f0bf07b73f8aef633cfb360c10f8a900a746b55cb1c0fa291 +size 12255 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/6U/6T7ODNLR62JH0BULT1J4AE.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/6U/6T7ODNLR62JH0BULT1J4AE.uasset new file mode 100644 index 0000000..b8e6da1 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/6U/6T7ODNLR62JH0BULT1J4AE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42cc911ca562574bfc6ffa84faefe17c7ab6a27cde49f13b5aa3f11cbec98651 +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/9S/LQQ0H0SH70184OCJX1HNZ4.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/9S/LQQ0H0SH70184OCJX1HNZ4.uasset new file mode 100644 index 0000000..2aa6428 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/9S/LQQ0H0SH70184OCJX1HNZ4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f93f83e35dc35f22e0ecffb932e112ab39c586c5f3a1aa414a45615079c4244 +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/C4/C5A84ZQFO9N5LUDADATW0V.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/C4/C5A84ZQFO9N5LUDADATW0V.uasset new file mode 100644 index 0000000..c37ecf2 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/C4/C5A84ZQFO9N5LUDADATW0V.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b436607d2b243ee6fc2301fcab9bbb9711283e5f50ca41dfe67909a257785ca +size 4537 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/J4/0LD3OOMMA7A1BOXNC9KUEB.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/J4/0LD3OOMMA7A1BOXNC9KUEB.uasset new file mode 100644 index 0000000..65ae08d --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/J4/0LD3OOMMA7A1BOXNC9KUEB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6c02462b6334ddd417e0b3214f241949133522a433006df716172fbcaf1d534 +size 4351 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/LR/BCXS1F48STUAAKWQ5V9AA5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/LR/BCXS1F48STUAAKWQ5V9AA5.uasset new file mode 100644 index 0000000..bb0c83a --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/LR/BCXS1F48STUAAKWQ5V9AA5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d72163e6ddf75e63b9af5f4f371bab4137e92f34ac8e887c1fe52ca730b54b00 +size 4465 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/ML/40T5MMM0YXF4J1LHKAELOM.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/ML/40T5MMM0YXF4J1LHKAELOM.uasset new file mode 100644 index 0000000..2fbbe17 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/ML/40T5MMM0YXF4J1LHKAELOM.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5b5179ab5188720e8b9e01ca00966dfff3313c931a0107fd204e5b539200fea +size 4387 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/N4/8DRPJ2DF8214RH35JA4GMC.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/N4/8DRPJ2DF8214RH35JA4GMC.uasset new file mode 100644 index 0000000..d454f26 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/N4/8DRPJ2DF8214RH35JA4GMC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d81dc0f93ca41134a58b2ee601e4cf76b9f6a5c27d1c203b63456a2053d7852f +size 4617 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/O2/81W0XWDLGITVXVMUB25TDV.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/O2/81W0XWDLGITVXVMUB25TDV.uasset new file mode 100644 index 0000000..d60ffcf --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/O2/81W0XWDLGITVXVMUB25TDV.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8436fa37abec3d42a5935fb0208dfc2d5882c6e74aba0459b87f0f5471137aae +size 4498 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/P8/NS40YVZO11JHTQKF9JMSXF.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/P8/NS40YVZO11JHTQKF9JMSXF.uasset new file mode 100644 index 0000000..591d977 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/C/P8/NS40YVZO11JHTQKF9JMSXF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58bfd9a450908163e2e1bb102750fe724c6f91efc72dd2dd897844cfe47dd594 +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/73/Q8RBKW1UCEJ0BQANAITWX5.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/73/Q8RBKW1UCEJ0BQANAITWX5.uasset new file mode 100644 index 0000000..db070fc --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/73/Q8RBKW1UCEJ0BQANAITWX5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5adc8f11165a156feafec4089a0b404ff28c13bc6970aa95fe658cd701027df3 +size 4438 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/7P/SBT259X67MUNBQI7R3T53P.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/7P/SBT259X67MUNBQI7R3T53P.uasset new file mode 100644 index 0000000..d839ed4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/7P/SBT259X67MUNBQI7R3T53P.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:532602f22332f0b7571477740661574c2196e6a6a5653d8ed153ff9011f8521f +size 4554 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/82/UMH0N4CZQFRU0ME4IZXWI8.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/82/UMH0N4CZQFRU0ME4IZXWI8.uasset new file mode 100644 index 0000000..b426cca --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/82/UMH0N4CZQFRU0ME4IZXWI8.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcda9ea88b875dfab7526019a534c97e5e71a4995b87b477ec7f1eeb829f18e2 +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/88/TDH4MAYEZP207X3DMEB2OI.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/88/TDH4MAYEZP207X3DMEB2OI.uasset new file mode 100644 index 0000000..ac064bd --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/88/TDH4MAYEZP207X3DMEB2OI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:baff42fb1d6a46fb55ee554939b0b313a2701406fdba58753371c2b67f20f778 +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/8J/EQEW33IHHR667Y7DPDUFKK.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/8J/EQEW33IHHR667Y7DPDUFKK.uasset new file mode 100644 index 0000000..264874e --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/8J/EQEW33IHHR667Y7DPDUFKK.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:859047fe265ce319b97ef6f694ddeea919de7ea84416a697ca169b30fd9e2835 +size 4438 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/EG/T8AKUCFASX0QNVT22HD30H.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/EG/T8AKUCFASX0QNVT22HD30H.uasset new file mode 100644 index 0000000..d8b4b8c --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/EG/T8AKUCFASX0QNVT22HD30H.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96c3968ddaa0468baf65929981cc0181a098961c0a6a3d8e15c99537c3a10915 +size 8841 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/MO/C4L1DOMPEFG1B1T21Z4RNL.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/MO/C4L1DOMPEFG1B1T21Z4RNL.uasset new file mode 100644 index 0000000..e77bbd3 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/MO/C4L1DOMPEFG1B1T21Z4RNL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96a4e9f4fcddb7fae6196ddaea73bf26c9904d33b9033d3cfa0d4d0576df9094 +size 4443 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T2/1CGXTAH2ZI6S335DJWHRJ9.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T2/1CGXTAH2ZI6S335DJWHRJ9.uasset new file mode 100644 index 0000000..0fff6ee --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T2/1CGXTAH2ZI6S335DJWHRJ9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cae6ae1f54e9b3333ce20067e851d7f69558c2726c2f8600bddebb768c41c4e +size 4570 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T6/99IJ6BRDKY68PMANM4E0U1.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T6/99IJ6BRDKY68PMANM4E0U1.uasset new file mode 100644 index 0000000..4107443 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/T6/99IJ6BRDKY68PMANM4E0U1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b4c24f3c354075def574c94b2d66c4aa3762b44f70541e95013f52861b4374f +size 4465 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/W0/7ZPJ8M3MEVY6KHBGJC37EZ.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/W0/7ZPJ8M3MEVY6KHBGJC37EZ.uasset new file mode 100644 index 0000000..2d525ef --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/D/W0/7ZPJ8M3MEVY6KHBGJC37EZ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a89a7ccaae9c67089e83e15fc863a671e898f36a51628401b2466842e4bd3d1a +size 4513 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/DA/K28CUXOWD7LWSW25P6Z35P.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/DA/K28CUXOWD7LWSW25P6Z35P.uasset new file mode 100644 index 0000000..c928dfc --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/DA/K28CUXOWD7LWSW25P6Z35P.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:313952a2086e40fb24f2ac4e96bdde85f34b43e7025ad922820ccbba03084667 +size 4806 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/E2/LUCPJMX9ZH469ORNA5LMBP.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/E2/LUCPJMX9ZH469ORNA5LMBP.uasset new file mode 100644 index 0000000..576d2ea --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/E2/LUCPJMX9ZH469ORNA5LMBP.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58c5a2582a8518b4063d89b12fcf9e495ef2e19b36d360a9ff63bb2855bb5f2e +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/F3/8FPOFB99K2OT9AF8LGCI1G.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/F3/8FPOFB99K2OT9AF8LGCI1G.uasset new file mode 100644 index 0000000..57f03ac --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/F3/8FPOFB99K2OT9AF8LGCI1G.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:433101359c352b433fb6e7ab7a1bb7ed87d3ca68ad1a41360f10cc4e465f5310 +size 4438 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/VE/IBZI1HGCXN01TW4JJ5RBOU.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/VE/IBZI1HGCXN01TW4JJ5RBOU.uasset new file mode 100644 index 0000000..438f882 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/E/VE/IBZI1HGCXN01TW4JJ5RBOU.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8df6925acc215664a3611718542373a4b788335af2dcae2266d51d83e04090cb +size 4449 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/03/7O6UXFI7OYBTT8XLD8LOQX.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/03/7O6UXFI7OYBTT8XLD8LOQX.uasset new file mode 100644 index 0000000..22132d4 --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/03/7O6UXFI7OYBTT8XLD8LOQX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37b31585f5bec9cfa746e65f02698a94ef20836bf8f187674e4189425b215e9e +size 4788 diff --git a/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/49/VR137PSSEONSZYOJDXKSNI.uasset b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/49/VR137PSSEONSZYOJDXKSNI.uasset new file mode 100644 index 0000000..0a752ff --- /dev/null +++ b/Content/__ExternalActors__/Variant_SideScrolling/Lvl_SideScrolling/F/49/VR137PSSEONSZYOJDXKSNI.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56db860f5e91596a7a1319d00aa1cbffce327c4b8f5c0d247064594f00e63aa6 +size 4465 diff --git a/Content/__ExternalObjects__/ThirdPerson/Lvl_ThirdPerson/0/TQ/1UP2MCOIYXC0GTW985R4K0.uasset b/Content/__ExternalObjects__/ThirdPerson/Lvl_ThirdPerson/0/TQ/1UP2MCOIYXC0GTW985R4K0.uasset new file mode 100644 index 0000000..02c60a9 --- /dev/null +++ b/Content/__ExternalObjects__/ThirdPerson/Lvl_ThirdPerson/0/TQ/1UP2MCOIYXC0GTW985R4K0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bb0cff17e56dd734bbcb3f746f387f601ae46cf2e7c1bd2a3660d971590a65e +size 1867 diff --git a/Content/__ExternalObjects__/ThirdPerson/Lvl_ThirdPerson/5/TX/O6OLZU4WSCI3YRJS922SWL.uasset b/Content/__ExternalObjects__/ThirdPerson/Lvl_ThirdPerson/5/TX/O6OLZU4WSCI3YRJS922SWL.uasset new file mode 100644 index 0000000..e3897e8 --- /dev/null +++ b/Content/__ExternalObjects__/ThirdPerson/Lvl_ThirdPerson/5/TX/O6OLZU4WSCI3YRJS922SWL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80c21c703b7747b2e849b7a39d9e354091d075737892398d581d0eca66c8fbac +size 1863 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/0/AJ/Q42ZSOSTBUDHJO9I0YFJH8.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/0/AJ/Q42ZSOSTBUDHJO9I0YFJH8.uasset new file mode 100644 index 0000000..f39c194 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/0/AJ/Q42ZSOSTBUDHJO9I0YFJH8.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:781a204f92313418173471e1aebeee6e83bbc5383afa1e8059daf130d1a657b3 +size 1913 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/0/QK/03V86HC7QVQDQ0QJ94CYLX.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/0/QK/03V86HC7QVQDQ0QJ94CYLX.uasset new file mode 100644 index 0000000..9d7aded --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/0/QK/03V86HC7QVQDQ0QJ94CYLX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8762a3722d89b79adb7365aad7c05f2757bab7fc05fa04c197ad364268050ce +size 1917 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/7X/QGWW4SCWICG53A9K5OPS0G.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/7X/QGWW4SCWICG53A9K5OPS0G.uasset new file mode 100644 index 0000000..86d8ced --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/7X/QGWW4SCWICG53A9K5OPS0G.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72cd5aec0aac6ef17055a58f791cc34c8f00fbb31f798ec91ea7a3713b286cb2 +size 1923 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/K1/7BSJXD4YWZ2V1U8AB8O3Z2.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/K1/7BSJXD4YWZ2V1U8AB8O3Z2.uasset new file mode 100644 index 0000000..ee74fd6 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/K1/7BSJXD4YWZ2V1U8AB8O3Z2.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7115d02d3baf01d984618a15936815d4533f1b974778b1f8fb57833ca1cb8089 +size 1829 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/SR/0VGOAD2U620LLZDVVPGFFF.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/SR/0VGOAD2U620LLZDVVPGFFF.uasset new file mode 100644 index 0000000..cb060e0 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/1/SR/0VGOAD2U620LLZDVVPGFFF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f66938e0b8ed19b41a74409ffc5cddb94ccbeb3bc0cb39b2d0219993f287303 +size 1923 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/2/C9/058CTC6QHX54BNVCVEDMD5.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/2/C9/058CTC6QHX54BNVCVEDMD5.uasset new file mode 100644 index 0000000..b3d3041 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/2/C9/058CTC6QHX54BNVCVEDMD5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f525cc015b00fa3fe6128a8ddf29a540ea89c1d9fdd7e18280648790ebe3111 +size 1923 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/2/QF/FZ8IH801CN94E0HZNJIAMB.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/2/QF/FZ8IH801CN94E0HZNJIAMB.uasset new file mode 100644 index 0000000..29b582f --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/2/QF/FZ8IH801CN94E0HZNJIAMB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a97239306449a831b99b7d669bf150406024bd483e5cb334c1a260de7c65107 +size 1921 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/5/EA/O3MBSQAXYS6XJUBQR76X9N.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/5/EA/O3MBSQAXYS6XJUBQR76X9N.uasset new file mode 100644 index 0000000..d43b137 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/5/EA/O3MBSQAXYS6XJUBQR76X9N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9776e2f1c26ef15ac2f2e766da4f626f0a57276965a3e7c95d66cd08affcc69b +size 1923 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/7/O5/2TVKAOBOK3OMUSU4BNULM9.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/7/O5/2TVKAOBOK3OMUSU4BNULM9.uasset new file mode 100644 index 0000000..6f7cb69 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/7/O5/2TVKAOBOK3OMUSU4BNULM9.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:720bf67f90e0f160166348c001e24c1a2f0fce24d024449e8473a2c4f7a00a97 +size 1911 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/9/SK/PAE64UA62B4I6LK904O50Y.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/9/SK/PAE64UA62B4I6LK904O50Y.uasset new file mode 100644 index 0000000..73da9c3 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/9/SK/PAE64UA62B4I6LK904O50Y.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6cec2199fe9754beead9cc551b0b3ee0f2935fcf164c9d1a57752d15a7074c6 +size 1913 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/6N/VD4T3XSWEKR61PNFVRIPB4.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/6N/VD4T3XSWEKR61PNFVRIPB4.uasset new file mode 100644 index 0000000..747c7e8 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/6N/VD4T3XSWEKR61PNFVRIPB4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69ccdb6d67dacaa1876b74e7a4fe68c5a5744d369f798c706327c70da6e0379c +size 1913 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/D9/DAOWHPOKN1G4LLVA17BQ4F.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/D9/DAOWHPOKN1G4LLVA17BQ4F.uasset new file mode 100644 index 0000000..d2dcf3e --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/D9/DAOWHPOKN1G4LLVA17BQ4F.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aba28a8b5d3b51a6a5559ad43c5ef2eef846bcf023edc5ad3588d43fccac287f +size 1913 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/YB/BKATFJPNWZY6410P5E2OS4.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/YB/BKATFJPNWZY6410P5E2OS4.uasset new file mode 100644 index 0000000..e9266ea --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/A/YB/BKATFJPNWZY6410P5E2OS4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae381106f289230ec80122e5136342557b846774e9e19912e274254d16a2b657 +size 1925 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/B/4J/TM33UR07N3CL6T1XDN76MR.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/B/4J/TM33UR07N3CL6T1XDN76MR.uasset new file mode 100644 index 0000000..0550f1e --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/B/4J/TM33UR07N3CL6T1XDN76MR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63535a85b27d7546e009c4a954aeab499a6ef81175df9aa813ab0793cad36ba4 +size 1829 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/B/4P/81CFSVQHA7OU7889MQEIM0.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/B/4P/81CFSVQHA7OU7889MQEIM0.uasset new file mode 100644 index 0000000..f201ba2 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/B/4P/81CFSVQHA7OU7889MQEIM0.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bab99e1340105b9df60e0b242eefbf28c274627bd5c86f037f12065b77a143c +size 1923 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/7O/MHGK46YY82PZMS60I1H4B5.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/7O/MHGK46YY82PZMS60I1H4B5.uasset new file mode 100644 index 0000000..049d4f1 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/7O/MHGK46YY82PZMS60I1H4B5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:619d6bf1f28188354535c7e34c5140ce08ed4bf2cdbb6faefe55e84e97ed832e +size 1917 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/BG/14XRTQLQ9HZHEKKS9TDV2B.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/BG/14XRTQLQ9HZHEKKS9TDV2B.uasset new file mode 100644 index 0000000..fdf37c8 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/BG/14XRTQLQ9HZHEKKS9TDV2B.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a38d8bda905d8d36e17e3be56caa616005f747b2cb95a63221cb1b877ffd2370 +size 1839 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/PM/J4QSJEZXX4QSU71S2XNSGB.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/PM/J4QSJEZXX4QSU71S2XNSGB.uasset new file mode 100644 index 0000000..935f40e --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/C/PM/J4QSJEZXX4QSU71S2XNSGB.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98fbf5bb09de928512ed24ad967e7c669dea7faad29f184a1876fa7f804f0319 +size 1923 diff --git a/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/D/AE/OPO6LLO34IW7V0SYGULM48.uasset b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/D/AE/OPO6LLO34IW7V0SYGULM48.uasset new file mode 100644 index 0000000..66fe466 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Combat/Lvl_Combat/D/AE/OPO6LLO34IW7V0SYGULM48.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52ee9459b9348584c9f5ecbc7d167bbf1bb963c5333546b0e9a01c48eda7e5bc +size 1919 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/9D/ODYKWBVQ5YPDXSDWJDSI5Z.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/9D/ODYKWBVQ5YPDXSDWJDSI5Z.uasset new file mode 100644 index 0000000..cee825b --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/9D/ODYKWBVQ5YPDXSDWJDSI5Z.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d690a5e9fc17e4bc699501b6cd7708db3e325d368a410b31741bd1efcdaab51e +size 1963 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/HU/BN9XQV23Z2PJ1NNACEOHTX.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/HU/BN9XQV23Z2PJ1NNACEOHTX.uasset new file mode 100644 index 0000000..7c0a74d --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/HU/BN9XQV23Z2PJ1NNACEOHTX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51f1c6c2c9399f0ff34b2fa3268f79e858a86c3a2cd0b3e2280698795b9bb61a +size 1879 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/IT/LAONTWEKWR03FY1W3WGQNC.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/IT/LAONTWEKWR03FY1W3WGQNC.uasset new file mode 100644 index 0000000..feed60e --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/IT/LAONTWEKWR03FY1W3WGQNC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67e5c1c5e78379d264dd6dd1d79f2b501907ff087ab8edc56c6fd2c217ed2cf0 +size 1889 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/VW/D1QERUEF4BT0SJ7JON4ABJ.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/VW/D1QERUEF4BT0SJ7JON4ABJ.uasset new file mode 100644 index 0000000..0cc7327 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/0/VW/D1QERUEF4BT0SJ7JON4ABJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5a79d9accbb31e46b4fd9d4e3e95f28e332b5339d8e69ef6dae73e444ec142d +size 1963 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/1/N4/K32KI0AG7N0DL49GXDSEHL.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/1/N4/K32KI0AG7N0DL49GXDSEHL.uasset new file mode 100644 index 0000000..a05cacb --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/1/N4/K32KI0AG7N0DL49GXDSEHL.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90c300fc11c6e37dfb1a401f1329592321ea11bf428443e0b95c9457b0d628a7 +size 1969 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/2/OE/06E4EHW0RK6BBO6IKZ8MM7.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/2/OE/06E4EHW0RK6BBO6IKZ8MM7.uasset new file mode 100644 index 0000000..77ccc76 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/2/OE/06E4EHW0RK6BBO6IKZ8MM7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc2b2f4a6d6ee1716b9e7052b8d2480b64f4d26d4e37dcdfbcb5468197b3b3eb +size 1879 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/7Z/29V5FZQ00G4SPGYVRIIHN5.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/7Z/29V5FZQ00G4SPGYVRIIHN5.uasset new file mode 100644 index 0000000..25c3c3c --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/7Z/29V5FZQ00G4SPGYVRIIHN5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a1acac098fc898f18247af5aecf6a185f2e6f246cc108b831cb50cbfa914b4f +size 1973 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/B1/01JFRDWADRKIKP06478EQG.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/B1/01JFRDWADRKIKP06478EQG.uasset new file mode 100644 index 0000000..f6dfb9c --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/5/B1/01JFRDWADRKIKP06478EQG.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20cc0ef712339d3ceb7914488b9f60775901e7f8e33d3c97e12b09f5f9ff32e8 +size 1963 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/36/KBB8RFBN2RRMBD1EAOZ825.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/36/KBB8RFBN2RRMBD1EAOZ825.uasset new file mode 100644 index 0000000..10e5bf5 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/36/KBB8RFBN2RRMBD1EAOZ825.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fccb49141809e7d848f987e466b2caf80a0ccd69554f7f39cbf5f7ee8661d92 +size 1983 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/GS/2WS5T7NPSL6P167YENZ0RX.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/GS/2WS5T7NPSL6P167YENZ0RX.uasset new file mode 100644 index 0000000..70f75a0 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/GS/2WS5T7NPSL6P167YENZ0RX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:323d5e2133962684b5084abb6785a20335ad6e6b77c29f7bda5a6975d482d3db +size 1973 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/Q3/KY42ITXWBEPD99BD50GCCJ.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/Q3/KY42ITXWBEPD99BD50GCCJ.uasset new file mode 100644 index 0000000..369f765 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/8/Q3/KY42ITXWBEPD99BD50GCCJ.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f539007155d85e95c1e0fef2d1d265c343fa783bfc62f21e11c6dadd49d815b6 +size 1969 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/9/UZ/KTVOLZ6X4TIVACY98L8NUE.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/9/UZ/KTVOLZ6X4TIVACY98L8NUE.uasset new file mode 100644 index 0000000..611e102 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/9/UZ/KTVOLZ6X4TIVACY98L8NUE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ea2a9c87455688befb96322e6211bbc426f72eb4ba0479336372cc3dc2236d +size 1969 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/QJ/Q8MUZMCPNSAFNQNT1EMPEO.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/QJ/Q8MUZMCPNSAFNQNT1EMPEO.uasset new file mode 100644 index 0000000..98cd621 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/QJ/Q8MUZMCPNSAFNQNT1EMPEO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38e6da1524be83ebed12f9555248667177a97a6677b41f42b1990a3827f1fb69 +size 1969 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/Y4/TGT919L5P5S1G33ISKEPWO.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/Y4/TGT919L5P5S1G33ISKEPWO.uasset new file mode 100644 index 0000000..00f9576 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/D/Y4/TGT919L5P5S1G33ISKEPWO.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7478a6e00b818f96a95d8b6b25900421d1619fffaad55e6b0a7bc51f87f36835 +size 1971 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/AU/ABFDDJXNWORLPCM5L00YZ8.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/AU/ABFDDJXNWORLPCM5L00YZ8.uasset new file mode 100644 index 0000000..65fdb70 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/AU/ABFDDJXNWORLPCM5L00YZ8.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afe6ec54abe5f43153a72cc1e1a75ccee0da26f052b9baf91609cdbf56908837 +size 1969 diff --git a/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/VP/CTS3EAYXWWHWS91H39XWNY.uasset b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/VP/CTS3EAYXWWHWS91H39XWNY.uasset new file mode 100644 index 0000000..d33115c --- /dev/null +++ b/Content/__ExternalObjects__/Variant_Platforming/Lvl_Platforming/E/VP/CTS3EAYXWWHWS91H39XWNY.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c42126fe9504e94b9e19cbaa65dcbafa57a5d37df0554e2af00ede21a6fc4665 +size 1977 diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/UG/ZX8RGGTMXVLSKTMZHEWEKR.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/UG/ZX8RGGTMXVLSKTMZHEWEKR.uasset new file mode 100644 index 0000000..381c6b1 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/UG/ZX8RGGTMXVLSKTMZHEWEKR.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3e16cdd217d258964fc0f84dc5297ee5b7e47c12a1469eb133db05784a9097d +size 1899 diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/Z1/UMJIL66X80HOZOJFKETNE8.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/Z1/UMJIL66X80HOZOJFKETNE8.uasset new file mode 100644 index 0000000..a6813ab --- /dev/null +++ b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/1/Z1/UMJIL66X80HOZOJFKETNE8.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d7336dc530170f3da509e8a56c10a4e76646de4c9d43977c1b62bd5782c5081 +size 1899 diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/8/31/NU4AYO6JNDEAFXR2NA7X2O.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/8/31/NU4AYO6JNDEAFXR2NA7X2O.uasset new file mode 100644 index 0000000..9b6e862 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/8/31/NU4AYO6JNDEAFXR2NA7X2O.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb56655dfea956c6ce0219d957672a1d2b3f9ceae37d60f733be59af5d52a2d7 +size 1903 diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/9/XZ/RWPO76SKN90CVFMFKTDPKE.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/9/XZ/RWPO76SKN90CVFMFKTDPKE.uasset new file mode 100644 index 0000000..51d40d3 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/9/XZ/RWPO76SKN90CVFMFKTDPKE.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bdfd6a9cb0ec2e2fd641e583bf7854a7031320670fb2e5e05df55a72ee35380 +size 1889 diff --git a/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/A/KQ/NGY0EZTAH2RRKD753U65B5.uasset b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/A/KQ/NGY0EZTAH2RRKD753U65B5.uasset new file mode 100644 index 0000000..a0fad02 --- /dev/null +++ b/Content/__ExternalObjects__/Variant_SideScrolling/Lvl_SideScrolling/A/KQ/NGY0EZTAH2RRKD753U65B5.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2aab5a08b1c0e63e4b7f7900acd4ce26be52953cd3d15efc2dd69e7b15d9819a +size 1897 diff --git a/Source/AgrarianGame.Target.cs b/Source/AgrarianGame.Target.cs new file mode 100644 index 0000000..63674cb --- /dev/null +++ b/Source/AgrarianGame.Target.cs @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; +using System.Collections.Generic; + +public class AgrarianGameTarget : TargetRules +{ + public AgrarianGameTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Game; + DefaultBuildSettings = BuildSettingsVersion.V6; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_7; + ExtraModuleNames.Add("AgrarianGame"); + } +} diff --git a/Source/AgrarianGame/AgrarianCampfire.cpp b/Source/AgrarianGame/AgrarianCampfire.cpp new file mode 100644 index 0000000..006e2a3 --- /dev/null +++ b/Source/AgrarianGame/AgrarianCampfire.cpp @@ -0,0 +1,121 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianCampfire.h" +#include "AgrarianGameCharacter.h" +#include "AgrarianInventoryComponent.h" +#include "AgrarianSurvivalComponent.h" +#include "Components/PointLightComponent.h" +#include "Components/StaticMeshComponent.h" +#include "Kismet/GameplayStatics.h" +#include "Net/UnrealNetwork.h" + +AAgrarianCampfire::AAgrarianCampfire() +{ + PrimaryActorTick.bCanEverTick = true; + bReplicates = true; + + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + RootComponent = Mesh; + + FireLight = CreateDefaultSubobject(TEXT("FireLight")); + FireLight->SetupAttachment(RootComponent); + FireLight->SetIntensity(0.0f); + FireLight->SetAttenuationRadius(WarmthRadius); + FireLight->SetLightColor(FLinearColor(1.0f, 0.45f, 0.18f)); +} + +void AAgrarianCampfire::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + + if (HasAuthority() && bLit) + { + FuelSeconds = FMath::Max(0.0f, FuelSeconds - DeltaSeconds); + if (FuelSeconds <= 0.0f) + { + bLit = false; + UpdateVisualState(); + } + + WarmNearbyCharacters(DeltaSeconds); + } +} + +void AAgrarianCampfire::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(AAgrarianCampfire, bLit); + DOREPLIFETIME(AAgrarianCampfire, FuelSeconds); +} + +FText AAgrarianCampfire::GetInteractionText_Implementation(const AAgrarianGameCharacter* Interactor) const +{ + return bLit ? FText::FromString(TEXT("Add fuel")) : FText::FromString(TEXT("Light fire")); +} + +bool AAgrarianCampfire::CanInteract_Implementation(const AAgrarianGameCharacter* Interactor) const +{ + return Interactor != nullptr; +} + +void AAgrarianCampfire::Interact_Implementation(AAgrarianGameCharacter* Interactor) +{ + if (!HasAuthority() || !Interactor) + { + return; + } + + UAgrarianInventoryComponent* Inventory = Interactor->GetInventoryComponent(); + if (Inventory && Inventory->RemoveItem(TEXT("wood"), 1)) + { + AddFuel(90.0f); + bLit = true; + UpdateVisualState(); + } +} + +void AAgrarianCampfire::AddFuel(float Seconds) +{ + if (HasAuthority()) + { + FuelSeconds += FMath::Max(0.0f, Seconds); + if (FuelSeconds > 0.0f) + { + bLit = true; + } + UpdateVisualState(); + } +} + +void AAgrarianCampfire::OnRep_FireState() +{ + UpdateVisualState(); +} + +void AAgrarianCampfire::UpdateVisualState() +{ + if (FireLight) + { + FireLight->SetIntensity(bLit ? 4200.0f : 0.0f); + } +} + +void AAgrarianCampfire::WarmNearbyCharacters(float DeltaSeconds) +{ + TArray Characters; + UGameplayStatics::GetAllActorsOfClass(this, AAgrarianGameCharacter::StaticClass(), Characters); + + for (AActor* Actor : Characters) + { + AAgrarianGameCharacter* Character = Cast(Actor); + if (!Character || FVector::DistSquared(Character->GetActorLocation(), GetActorLocation()) > FMath::Square(WarmthRadius)) + { + continue; + } + + if (UAgrarianSurvivalComponent* SurvivalComponent = Character->GetSurvivalComponent()) + { + SurvivalComponent->AddWarmth(WarmthPerSecond * DeltaSeconds); + } + } +} diff --git a/Source/AgrarianGame/AgrarianCampfire.h b/Source/AgrarianGame/AgrarianCampfire.h new file mode 100644 index 0000000..6be9cfb --- /dev/null +++ b/Source/AgrarianGame/AgrarianCampfire.h @@ -0,0 +1,55 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "AgrarianInteractable.h" +#include "AgrarianCampfire.generated.h" + +class UPointLightComponent; +class UStaticMeshComponent; + +UCLASS(Blueprintable) +class AAgrarianCampfire : public AActor, public IAgrarianInteractable +{ + GENERATED_BODY() + +public: + AAgrarianCampfire(); + + virtual void Tick(float DeltaSeconds) override; + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Fire") + TObjectPtr Mesh; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Fire") + TObjectPtr FireLight; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing = OnRep_FireState, Category = "Agrarian|Fire") + bool bLit = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Replicated, Category = "Agrarian|Fire", meta = (ClampMin = "0")) + float FuelSeconds = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Fire", meta = (ClampMin = "0")) + float WarmthRadius = 550.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Fire", meta = (ClampMin = "0")) + float WarmthPerSecond = 0.02f; + + virtual FText GetInteractionText_Implementation(const AAgrarianGameCharacter* Interactor) const override; + virtual bool CanInteract_Implementation(const AAgrarianGameCharacter* Interactor) const override; + virtual void Interact_Implementation(AAgrarianGameCharacter* Interactor) override; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Fire") + void AddFuel(float Seconds); + +protected: + UFUNCTION() + void OnRep_FireState(); + + void UpdateVisualState(); + void WarmNearbyCharacters(float DeltaSeconds); +}; diff --git a/Source/AgrarianGame/AgrarianCraftingComponent.cpp b/Source/AgrarianGame/AgrarianCraftingComponent.cpp new file mode 100644 index 0000000..e3dd9c7 --- /dev/null +++ b/Source/AgrarianGame/AgrarianCraftingComponent.cpp @@ -0,0 +1,134 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianCraftingComponent.h" +#include "AgrarianInventoryComponent.h" + +UAgrarianCraftingComponent::UAgrarianCraftingComponent() +{ + PrimaryComponentTick.bCanEverTick = false; + SetIsReplicatedByDefault(true); +} + +bool UAgrarianCraftingComponent::CanCraft(FName RecipeId, FText& FailureReason) const +{ + FAgrarianRecipe Recipe; + if (!FindRecipe(RecipeId, Recipe)) + { + FailureReason = FText::FromString(TEXT("Recipe is not known.")); + return false; + } + + const UAgrarianInventoryComponent* Inventory = GetInventory(); + if (!Inventory) + { + FailureReason = FText::FromString(TEXT("No inventory is available.")); + return false; + } + + for (const FAgrarianItemStack& Ingredient : Recipe.Ingredients) + { + if (!Inventory->HasItem(Ingredient.ItemId, Ingredient.Quantity)) + { + FailureReason = FText::Format( + FText::FromString(TEXT("Missing ingredient: {0}")), + Ingredient.DisplayName.IsEmpty() ? FText::FromName(Ingredient.ItemId) : Ingredient.DisplayName); + return false; + } + } + + return true; +} + +bool UAgrarianCraftingComponent::Craft(FName RecipeId) +{ + if (!GetOwner()) + { + return false; + } + + if (!GetOwner()->HasAuthority()) + { + ServerCraft(RecipeId); + return true; + } + + FText FailureReason; + if (!CanCraft(RecipeId, FailureReason)) + { + FailCraft(RecipeId, FailureReason); + return false; + } + + FAgrarianRecipe Recipe; + FindRecipe(RecipeId, Recipe); + + UAgrarianInventoryComponent* Inventory = GetInventory(); + if (!Inventory) + { + FailCraft(RecipeId, FText::FromString(TEXT("No inventory is available."))); + return false; + } + + for (const FAgrarianItemStack& Ingredient : Recipe.Ingredients) + { + Inventory->RemoveItem(Ingredient.ItemId, Ingredient.Quantity); + } + + if (!Inventory->AddItem(Recipe.Result)) + { + FailCraft(RecipeId, FText::FromString(TEXT("Inventory is full."))); + return false; + } + + OnCraftCompleted.Broadcast(Recipe.RecipeId, Recipe.Result); + return true; +} + +void UAgrarianCraftingComponent::ServerCraft_Implementation(FName RecipeId) +{ + Craft(RecipeId); +} + +bool UAgrarianCraftingComponent::AddKnownRecipe(const FAgrarianRecipe& Recipe) +{ + if (Recipe.RecipeId == NAME_None || !Recipe.Result.IsValidStack()) + { + return false; + } + + for (FAgrarianRecipe& Existing : KnownRecipes) + { + if (Existing.RecipeId == Recipe.RecipeId) + { + Existing = Recipe; + return true; + } + } + + KnownRecipes.Add(Recipe); + return true; +} + +bool UAgrarianCraftingComponent::FindRecipe(FName RecipeId, FAgrarianRecipe& OutRecipe) const +{ + for (const FAgrarianRecipe& Recipe : KnownRecipes) + { + if (Recipe.RecipeId == RecipeId) + { + OutRecipe = Recipe; + return true; + } + } + + return false; +} + +UAgrarianInventoryComponent* UAgrarianCraftingComponent::GetInventory() const +{ + return GetOwner() ? GetOwner()->FindComponentByClass() : nullptr; +} + +void UAgrarianCraftingComponent::FailCraft(FName RecipeId, const FText& Reason) const +{ + OnCraftFailed.Broadcast(RecipeId, Reason); +} diff --git a/Source/AgrarianGame/AgrarianCraftingComponent.h b/Source/AgrarianGame/AgrarianCraftingComponent.h new file mode 100644 index 0000000..453575d --- /dev/null +++ b/Source/AgrarianGame/AgrarianCraftingComponent.h @@ -0,0 +1,50 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "AgrarianTypes.h" +#include "AgrarianCraftingComponent.generated.h" + +class UAgrarianInventoryComponent; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FAgrarianCraftCompletedSignature, FName, RecipeId, const FAgrarianItemStack&, Result); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FAgrarianCraftFailedSignature, FName, RecipeId, FText, Reason); + +UCLASS(ClassGroup = (Agrarian), BlueprintType, Blueprintable, meta = (BlueprintSpawnableComponent)) +class UAgrarianCraftingComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + UAgrarianCraftingComponent(); + + UPROPERTY(BlueprintAssignable, Category = "Agrarian|Crafting") + FAgrarianCraftCompletedSignature OnCraftCompleted; + + UPROPERTY(BlueprintAssignable, Category = "Agrarian|Crafting") + FAgrarianCraftFailedSignature OnCraftFailed; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting") + TArray KnownRecipes; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Crafting") + bool CanCraft(FName RecipeId, FText& FailureReason) const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Crafting") + bool Craft(FName RecipeId); + + UFUNCTION(Server, Reliable, BlueprintCallable, Category = "Agrarian|Crafting") + void ServerCraft(FName RecipeId); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Crafting") + bool AddKnownRecipe(const FAgrarianRecipe& Recipe); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Crafting") + bool FindRecipe(FName RecipeId, FAgrarianRecipe& OutRecipe) const; + +protected: + UAgrarianInventoryComponent* GetInventory() const; + void FailCraft(FName RecipeId, const FText& Reason) const; +}; diff --git a/Source/AgrarianGame/AgrarianGame.Build.cs b/Source/AgrarianGame/AgrarianGame.Build.cs new file mode 100644 index 0000000..031e561 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGame.Build.cs @@ -0,0 +1,51 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; + +public class AgrarianGame : ModuleRules +{ + public AgrarianGame(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] { + "Core", + "CoreUObject", + "Engine", + "InputCore", + "EnhancedInput", + "AIModule", + "StateTreeModule", + "GameplayStateTreeModule", + "UMG", + "Slate" + }); + + PrivateDependencyModuleNames.AddRange(new string[] { }); + + PublicIncludePaths.AddRange(new string[] { + "AgrarianGame", + "AgrarianGame/Variant_Platforming", + "AgrarianGame/Variant_Platforming/Animation", + "AgrarianGame/Variant_Combat", + "AgrarianGame/Variant_Combat/AI", + "AgrarianGame/Variant_Combat/Animation", + "AgrarianGame/Variant_Combat/Gameplay", + "AgrarianGame/Variant_Combat/Interfaces", + "AgrarianGame/Variant_Combat/UI", + "AgrarianGame/Variant_SideScrolling", + "AgrarianGame/Variant_SideScrolling/AI", + "AgrarianGame/Variant_SideScrolling/Gameplay", + "AgrarianGame/Variant_SideScrolling/Interfaces", + "AgrarianGame/Variant_SideScrolling/UI" + }); + + // Uncomment if you are using Slate UI + // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); + + // Uncomment if you are using online features + // PrivateDependencyModuleNames.Add("OnlineSubsystem"); + + // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true + } +} diff --git a/Source/AgrarianGame/AgrarianGame.cpp b/Source/AgrarianGame/AgrarianGame.cpp new file mode 100644 index 0000000..37ee5de --- /dev/null +++ b/Source/AgrarianGame/AgrarianGame.cpp @@ -0,0 +1,8 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "AgrarianGame.h" +#include "Modules/ModuleManager.h" + +IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, AgrarianGame, "AgrarianGame" ); + +DEFINE_LOG_CATEGORY(LogAgrarianGame) \ No newline at end of file diff --git a/Source/AgrarianGame/AgrarianGame.h b/Source/AgrarianGame/AgrarianGame.h new file mode 100644 index 0000000..72f7b6d --- /dev/null +++ b/Source/AgrarianGame/AgrarianGame.h @@ -0,0 +1,8 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" + +/** Main log category used across the project */ +DECLARE_LOG_CATEGORY_EXTERN(LogAgrarianGame, Log, All); \ No newline at end of file diff --git a/Source/AgrarianGame/AgrarianGameCharacter.cpp b/Source/AgrarianGame/AgrarianGameCharacter.cpp new file mode 100644 index 0000000..9a26507 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGameCharacter.cpp @@ -0,0 +1,212 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "AgrarianGameCharacter.h" +#include "AgrarianCraftingComponent.h" +#include "AgrarianInteractable.h" +#include "AgrarianInventoryComponent.h" +#include "AgrarianSurvivalComponent.h" +#include "Engine/LocalPlayer.h" +#include "Camera/CameraComponent.h" +#include "Components/CapsuleComponent.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "GameFramework/SpringArmComponent.h" +#include "GameFramework/Controller.h" +#include "EnhancedInputComponent.h" +#include "EnhancedInputSubsystems.h" +#include "InputActionValue.h" +#include "AgrarianGame.h" + +AAgrarianGameCharacter::AAgrarianGameCharacter() +{ + // Set size for collision capsule + GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f); + + // Don't rotate when the controller rotates. Let that just affect the camera. + bUseControllerRotationPitch = false; + bUseControllerRotationYaw = false; + bUseControllerRotationRoll = false; + + // Configure character movement + GetCharacterMovement()->bOrientRotationToMovement = true; + GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); + + // Note: For faster iteration times these variables, and many more, can be tweaked in the Character Blueprint + // instead of recompiling to adjust them + GetCharacterMovement()->JumpZVelocity = 500.f; + GetCharacterMovement()->AirControl = 0.35f; + GetCharacterMovement()->MaxWalkSpeed = 500.f; + GetCharacterMovement()->MinAnalogWalkSpeed = 20.f; + GetCharacterMovement()->BrakingDecelerationWalking = 2000.f; + GetCharacterMovement()->BrakingDecelerationFalling = 1500.0f; + + // Create a camera boom (pulls in towards the player if there is a collision) + CameraBoom = CreateDefaultSubobject(TEXT("CameraBoom")); + CameraBoom->SetupAttachment(RootComponent); + CameraBoom->TargetArmLength = 400.0f; + CameraBoom->bUsePawnControlRotation = true; + + // Create a follow camera + FollowCamera = CreateDefaultSubobject(TEXT("FollowCamera")); + FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); + FollowCamera->bUsePawnControlRotation = false; + + SurvivalComponent = CreateDefaultSubobject(TEXT("SurvivalComponent")); + InventoryComponent = CreateDefaultSubobject(TEXT("InventoryComponent")); + CraftingComponent = CreateDefaultSubobject(TEXT("CraftingComponent")); + + // Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) + // are set in the derived blueprint asset named ThirdPersonCharacter (to avoid direct content references in C++) +} + +void AAgrarianGameCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) { + + // Jumping + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping); + + // Moving + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAgrarianGameCharacter::Move); + EnhancedInputComponent->BindAction(MouseLookAction, ETriggerEvent::Triggered, this, &AAgrarianGameCharacter::Look); + + // Looking + EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AAgrarianGameCharacter::Look); + + if (InteractAction) + { + EnhancedInputComponent->BindAction(InteractAction, ETriggerEvent::Started, this, &AAgrarianGameCharacter::Interact); + } + } + else + { + UE_LOG(LogAgrarianGame, Error, TEXT("'%s' Failed to find an Enhanced Input component! This template is built to use the Enhanced Input system. If you intend to use the legacy system, then you will need to update this C++ file."), *GetNameSafe(this)); + } +} + +void AAgrarianGameCharacter::Move(const FInputActionValue& Value) +{ + // input is a Vector2D + FVector2D MovementVector = Value.Get(); + + // route the input + DoMove(MovementVector.X, MovementVector.Y); +} + +void AAgrarianGameCharacter::Look(const FInputActionValue& Value) +{ + // input is a Vector2D + FVector2D LookAxisVector = Value.Get(); + + // route the input + DoLook(LookAxisVector.X, LookAxisVector.Y); +} + +void AAgrarianGameCharacter::Interact() +{ + TryInteract(); +} + +void AAgrarianGameCharacter::DoMove(float Right, float Forward) +{ + if (GetController() != nullptr) + { + // find out which way is forward + const FRotator Rotation = GetController()->GetControlRotation(); + const FRotator YawRotation(0, Rotation.Yaw, 0); + + // get forward vector + const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); + + // get right vector + const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); + + // add movement + AddMovementInput(ForwardDirection, Forward); + AddMovementInput(RightDirection, Right); + } +} + +void AAgrarianGameCharacter::DoLook(float Yaw, float Pitch) +{ + if (GetController() != nullptr) + { + // add yaw and pitch input to controller + AddControllerYawInput(Yaw); + AddControllerPitchInput(Pitch); + } +} + +void AAgrarianGameCharacter::DoJumpStart() +{ + // signal the character to jump + Jump(); +} + +void AAgrarianGameCharacter::DoJumpEnd() +{ + // signal the character to stop jumping + StopJumping(); +} + +void AAgrarianGameCharacter::TryInteract() +{ + FVector TraceStart; + FRotator TraceRotation; + + if (Controller) + { + Controller->GetPlayerViewPoint(TraceStart, TraceRotation); + } + else + { + TraceStart = FollowCamera ? FollowCamera->GetComponentLocation() : GetActorLocation(); + TraceRotation = FollowCamera ? FollowCamera->GetComponentRotation() : GetActorRotation(); + } + + const FVector TraceEnd = TraceStart + TraceRotation.Vector() * InteractionDistance; + FHitResult Hit; + FCollisionQueryParams Params(SCENE_QUERY_STAT(AgrarianInteractTrace), false, this); + + if (!GetWorld() || !GetWorld()->LineTraceSingleByChannel(Hit, TraceStart, TraceEnd, ECC_Visibility, Params)) + { + return; + } + + AActor* HitActor = Hit.GetActor(); + if (!HitActor || !HitActor->GetClass()->ImplementsInterface(UAgrarianInteractable::StaticClass())) + { + return; + } + + if (HasAuthority()) + { + if (IAgrarianInteractable::Execute_CanInteract(HitActor, this)) + { + IAgrarianInteractable::Execute_Interact(HitActor, this); + } + } + else + { + ServerInteract(HitActor); + } +} + +void AAgrarianGameCharacter::ServerInteract_Implementation(AActor* TargetActor) +{ + if (!TargetActor || !TargetActor->GetClass()->ImplementsInterface(UAgrarianInteractable::StaticClass())) + { + return; + } + + if (FVector::DistSquared(TargetActor->GetActorLocation(), GetActorLocation()) > FMath::Square(InteractionDistance + 100.0f)) + { + return; + } + + if (IAgrarianInteractable::Execute_CanInteract(TargetActor, this)) + { + IAgrarianInteractable::Execute_Interact(TargetActor, this); + } +} diff --git a/Source/AgrarianGame/AgrarianGameCharacter.h b/Source/AgrarianGame/AgrarianGameCharacter.h new file mode 100644 index 0000000..929965d --- /dev/null +++ b/Source/AgrarianGame/AgrarianGameCharacter.h @@ -0,0 +1,139 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "Logging/LogMacros.h" +#include "AgrarianGameCharacter.generated.h" + +class USpringArmComponent; +class UCameraComponent; +class UInputAction; +class UAgrarianCraftingComponent; +class UAgrarianInventoryComponent; +class UAgrarianSurvivalComponent; +struct FInputActionValue; + +DECLARE_LOG_CATEGORY_EXTERN(LogTemplateCharacter, Log, All); + +/** + * A simple player-controllable third person character + * Implements a controllable orbiting camera + */ +UCLASS(abstract) +class AAgrarianGameCharacter : public ACharacter +{ + GENERATED_BODY() + + /** Camera boom positioning the camera behind the character */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USpringArmComponent* CameraBoom; + + /** Follow camera */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UCameraComponent* FollowCamera; + + /** Replicated survival state for hunger, thirst, stamina, health, temperature, and injury. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UAgrarianSurvivalComponent* SurvivalComponent; + + /** Replicated inventory used by gathering, primitive crafting, and early economy prototypes. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UAgrarianInventoryComponent* InventoryComponent; + + /** Primitive crafting component for MVP recipes and future knowledge progression. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UAgrarianCraftingComponent* CraftingComponent; + +protected: + + /** Jump Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* JumpAction; + + /** Move Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* MoveAction; + + /** Look Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* LookAction; + + /** Mouse Look Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* MouseLookAction; + + /** Interact Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* InteractAction; + + /** How far the player can interact with MVP objects. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Agrarian|Interaction", meta = (ClampMin = "100")) + float InteractionDistance = 450.0f; + +public: + + /** Constructor */ + AAgrarianGameCharacter(); + +protected: + + /** Initialize input action bindings */ + virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + +protected: + + /** Called for movement input */ + void Move(const FInputActionValue& Value); + + /** Called for looking input */ + void Look(const FInputActionValue& Value); + + /** Called for interaction input */ + void Interact(); + +public: + + /** Handles move inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoMove(float Right, float Forward); + + /** Handles look inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoLook(float Yaw, float Pitch); + + /** Handles jump pressed inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpStart(); + + /** Handles jump pressed inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpEnd(); + + /** Attempts to interact with the object in front of the player. */ + UFUNCTION(BlueprintCallable, Category="Agrarian|Interaction") + virtual void TryInteract(); + + /** Server-authoritative interaction entry point. */ + UFUNCTION(Server, Reliable) + void ServerInteract(AActor* TargetActor); + +public: + + /** Returns CameraBoom subobject **/ + FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; } + + /** Returns FollowCamera subobject **/ + FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; } + + /** Returns SurvivalComponent subobject **/ + FORCEINLINE UAgrarianSurvivalComponent* GetSurvivalComponent() const { return SurvivalComponent; } + + /** Returns InventoryComponent subobject **/ + FORCEINLINE UAgrarianInventoryComponent* GetInventoryComponent() const { return InventoryComponent; } + + /** Returns CraftingComponent subobject **/ + FORCEINLINE UAgrarianCraftingComponent* GetCraftingComponent() const { return CraftingComponent; } +}; + diff --git a/Source/AgrarianGame/AgrarianGameGameMode.cpp b/Source/AgrarianGame/AgrarianGameGameMode.cpp new file mode 100644 index 0000000..998cf69 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGameGameMode.cpp @@ -0,0 +1,9 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "AgrarianGameGameMode.h" +#include "AgrarianGameState.h" + +AAgrarianGameGameMode::AAgrarianGameGameMode() +{ + GameStateClass = AAgrarianGameState::StaticClass(); +} diff --git a/Source/AgrarianGame/AgrarianGameGameMode.h b/Source/AgrarianGame/AgrarianGameGameMode.h new file mode 100644 index 0000000..eb1ec13 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGameGameMode.h @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "AgrarianGameGameMode.generated.h" + +/** + * Simple GameMode for a third person game + */ +UCLASS(abstract) +class AAgrarianGameGameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + + /** Constructor */ + AAgrarianGameGameMode(); +}; + + + diff --git a/Source/AgrarianGame/AgrarianGamePlayerController.cpp b/Source/AgrarianGame/AgrarianGamePlayerController.cpp new file mode 100644 index 0000000..5364e77 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGamePlayerController.cpp @@ -0,0 +1,67 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "AgrarianGamePlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "Engine/LocalPlayer.h" +#include "InputMappingContext.h" +#include "Blueprint/UserWidget.h" +#include "AgrarianGame.h" +#include "Widgets/Input/SVirtualJoystick.h" + +void AAgrarianGamePlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // only spawn touch controls on local player controllers + if (ShouldUseTouchControls() && IsLocalPlayerController()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(LogAgrarianGame, Error, TEXT("Could not spawn mobile controls widget.")); + + } + + } +} + +void AAgrarianGamePlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // Add Input Mapping Contexts + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!ShouldUseTouchControls()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } +} + +bool AAgrarianGamePlayerController::ShouldUseTouchControls() const +{ + // are we on a mobile platform? Should we force touch? + return SVirtualJoystick::ShouldDisplayTouchInterface() || bForceTouchControls; +} diff --git a/Source/AgrarianGame/AgrarianGamePlayerController.h b/Source/AgrarianGame/AgrarianGamePlayerController.h new file mode 100644 index 0000000..80c07bb --- /dev/null +++ b/Source/AgrarianGame/AgrarianGamePlayerController.h @@ -0,0 +1,52 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "AgrarianGamePlayerController.generated.h" + +class UInputMappingContext; +class UUserWidget; + +/** + * Basic PlayerController class for a third person game + * Manages input mappings + */ +UCLASS(abstract) +class AAgrarianGamePlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category ="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + UPROPERTY() + TObjectPtr MobileControlsWidget; + + /** If true, the player will use UMG touch controls even if not playing on mobile platforms */ + UPROPERTY(EditAnywhere, Config, Category = "Input|Touch Controls") + bool bForceTouchControls = false; + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Input mapping context setup */ + virtual void SetupInputComponent() override; + + /** Returns true if the player should use UMG touch controls */ + bool ShouldUseTouchControls() const; + +}; diff --git a/Source/AgrarianGame/AgrarianGameState.cpp b/Source/AgrarianGame/AgrarianGameState.cpp new file mode 100644 index 0000000..29696c9 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGameState.cpp @@ -0,0 +1,80 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianGameState.h" +#include "Net/UnrealNetwork.h" + +AAgrarianGameState::AAgrarianGameState() +{ + PrimaryActorTick.bCanEverTick = true; + bReplicates = true; +} + +void AAgrarianGameState::Tick(float DeltaSeconds) +{ + Super::Tick(DeltaSeconds); + + if (!HasAuthority()) + { + return; + } + + WorldHours += (DeltaSeconds / 60.0f) * GameHoursPerRealMinute; + while (WorldHours >= 24.0f) + { + WorldHours -= 24.0f; + } + + UpdateAmbientTemperature(); +} + +void AAgrarianGameState::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(AAgrarianGameState, WorldHours); + DOREPLIFETIME(AAgrarianGameState, Weather); + DOREPLIFETIME(AAgrarianGameState, AmbientTemperatureC); +} + +bool AAgrarianGameState::IsNight() const +{ + return WorldHours < 6.0f || WorldHours > 20.0f; +} + +void AAgrarianGameState::SetWeather(EAgrarianWeatherType NewWeather) +{ + if (HasAuthority()) + { + Weather = NewWeather; + UpdateAmbientTemperature(); + OnRep_Weather(); + } +} + +void AAgrarianGameState::OnRep_Weather() +{ + UpdateAmbientTemperature(); +} + +void AAgrarianGameState::UpdateAmbientTemperature() +{ + const float DayWarmth = FMath::Sin((WorldHours / 24.0f) * 2.0f * PI - (PI * 0.5f)) * 8.0f; + float WeatherModifier = 0.0f; + + switch (Weather) + { + case EAgrarianWeatherType::Rain: + WeatherModifier = -3.0f; + break; + case EAgrarianWeatherType::ColdWind: + WeatherModifier = -8.0f; + break; + case EAgrarianWeatherType::Storm: + WeatherModifier = -5.0f; + break; + default: + WeatherModifier = 0.0f; + break; + } + + AmbientTemperatureC = 10.0f + DayWarmth + WeatherModifier; +} diff --git a/Source/AgrarianGame/AgrarianGameState.h b/Source/AgrarianGame/AgrarianGameState.h new file mode 100644 index 0000000..c4a8995 --- /dev/null +++ b/Source/AgrarianGame/AgrarianGameState.h @@ -0,0 +1,44 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameStateBase.h" +#include "AgrarianTypes.h" +#include "AgrarianGameState.generated.h" + +UCLASS() +class AAgrarianGameState : public AGameStateBase +{ + GENERATED_BODY() + +public: + AAgrarianGameState(); + + virtual void Tick(float DeltaSeconds) override; + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Replicated, Category = "Agrarian|World") + float WorldHours = 8.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|World", meta = (ClampMin = "0.1")) + float GameHoursPerRealMinute = 0.5f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing = OnRep_Weather, Category = "Agrarian|World") + EAgrarianWeatherType Weather = EAgrarianWeatherType::Clear; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Replicated, Category = "Agrarian|World") + float AmbientTemperatureC = 12.0f; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|World") + bool IsNight() const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|World") + void SetWeather(EAgrarianWeatherType NewWeather); + +protected: + UFUNCTION() + void OnRep_Weather(); + + void UpdateAmbientTemperature(); +}; diff --git a/Source/AgrarianGame/AgrarianInteractable.cpp b/Source/AgrarianGame/AgrarianInteractable.cpp new file mode 100644 index 0000000..5844275 --- /dev/null +++ b/Source/AgrarianGame/AgrarianInteractable.cpp @@ -0,0 +1,3 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianInteractable.h" diff --git a/Source/AgrarianGame/AgrarianInteractable.h b/Source/AgrarianGame/AgrarianInteractable.h new file mode 100644 index 0000000..c7e7a06 --- /dev/null +++ b/Source/AgrarianGame/AgrarianInteractable.h @@ -0,0 +1,30 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "AgrarianInteractable.generated.h" + +class AAgrarianGameCharacter; + +UINTERFACE(BlueprintType) +class UAgrarianInteractable : public UInterface +{ + GENERATED_BODY() +}; + +class IAgrarianInteractable +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Agrarian|Interaction") + FText GetInteractionText(const AAgrarianGameCharacter* Interactor) const; + + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Agrarian|Interaction") + bool CanInteract(const AAgrarianGameCharacter* Interactor) const; + + UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Agrarian|Interaction") + void Interact(AAgrarianGameCharacter* Interactor); +}; diff --git a/Source/AgrarianGame/AgrarianInventoryComponent.cpp b/Source/AgrarianGame/AgrarianInventoryComponent.cpp new file mode 100644 index 0000000..b1dc5ee --- /dev/null +++ b/Source/AgrarianGame/AgrarianInventoryComponent.cpp @@ -0,0 +1,111 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianInventoryComponent.h" +#include "Net/UnrealNetwork.h" + +UAgrarianInventoryComponent::UAgrarianInventoryComponent() +{ + PrimaryComponentTick.bCanEverTick = false; + SetIsReplicatedByDefault(true); +} + +void UAgrarianInventoryComponent::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(UAgrarianInventoryComponent, Items); +} + +bool UAgrarianInventoryComponent::HasItem(FName ItemId, int32 Quantity) const +{ + return GetItemCount(ItemId) >= Quantity; +} + +int32 UAgrarianInventoryComponent::GetItemCount(FName ItemId) const +{ + int32 Count = 0; + for (const FAgrarianItemStack& Stack : Items) + { + if (Stack.ItemId == ItemId) + { + Count += Stack.Quantity; + } + } + return Count; +} + +bool UAgrarianInventoryComponent::AddItem(const FAgrarianItemStack& Stack) +{ + if (!GetOwner() || !GetOwner()->HasAuthority() || !Stack.IsValidStack()) + { + return false; + } + + for (FAgrarianItemStack& Existing : Items) + { + if (Existing.ItemId == Stack.ItemId) + { + Existing.Quantity += Stack.Quantity; + BroadcastInventoryChanged(); + return true; + } + } + + if (Items.Num() >= MaxSlots) + { + return false; + } + + Items.Add(Stack); + BroadcastInventoryChanged(); + return true; +} + +bool UAgrarianInventoryComponent::RemoveItem(FName ItemId, int32 Quantity) +{ + if (!GetOwner() || !GetOwner()->HasAuthority() || Quantity <= 0 || !HasItem(ItemId, Quantity)) + { + return false; + } + + int32 Remaining = Quantity; + for (int32 Index = Items.Num() - 1; Index >= 0 && Remaining > 0; --Index) + { + FAgrarianItemStack& Stack = Items[Index]; + if (Stack.ItemId != ItemId) + { + continue; + } + + const int32 Removed = FMath::Min(Stack.Quantity, Remaining); + Stack.Quantity -= Removed; + Remaining -= Removed; + + if (Stack.Quantity <= 0) + { + Items.RemoveAt(Index); + } + } + + BroadcastInventoryChanged(); + return true; +} + +void UAgrarianInventoryComponent::ServerAddItem_Implementation(const FAgrarianItemStack& Stack) +{ + AddItem(Stack); +} + +void UAgrarianInventoryComponent::ServerRemoveItem_Implementation(FName ItemId, int32 Quantity) +{ + RemoveItem(ItemId, Quantity); +} + +void UAgrarianInventoryComponent::OnRep_Items() +{ + BroadcastInventoryChanged(); +} + +void UAgrarianInventoryComponent::BroadcastInventoryChanged() +{ + OnInventoryChanged.Broadcast(); +} diff --git a/Source/AgrarianGame/AgrarianInventoryComponent.h b/Source/AgrarianGame/AgrarianInventoryComponent.h new file mode 100644 index 0000000..03a12ae --- /dev/null +++ b/Source/AgrarianGame/AgrarianInventoryComponent.h @@ -0,0 +1,54 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "AgrarianTypes.h" +#include "AgrarianInventoryComponent.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAgrarianInventoryChangedSignature); + +UCLASS(ClassGroup = (Agrarian), BlueprintType, Blueprintable, meta = (BlueprintSpawnableComponent)) +class UAgrarianInventoryComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + UAgrarianInventoryComponent(); + + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; + + UPROPERTY(BlueprintAssignable, Category = "Agrarian|Inventory") + FAgrarianInventoryChangedSignature OnInventoryChanged; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing = OnRep_Items, Category = "Agrarian|Inventory") + TArray Items; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Inventory", meta = (ClampMin = "1")) + int32 MaxSlots = 24; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Inventory") + bool HasItem(FName ItemId, int32 Quantity) const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Inventory") + int32 GetItemCount(FName ItemId) const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Inventory") + bool AddItem(const FAgrarianItemStack& Stack); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Inventory") + bool RemoveItem(FName ItemId, int32 Quantity); + + UFUNCTION(Server, Reliable, BlueprintCallable, Category = "Agrarian|Inventory") + void ServerAddItem(const FAgrarianItemStack& Stack); + + UFUNCTION(Server, Reliable, BlueprintCallable, Category = "Agrarian|Inventory") + void ServerRemoveItem(FName ItemId, int32 Quantity); + +protected: + UFUNCTION() + void OnRep_Items(); + + void BroadcastInventoryChanged(); +}; diff --git a/Source/AgrarianGame/AgrarianPersistenceSubsystem.cpp b/Source/AgrarianGame/AgrarianPersistenceSubsystem.cpp new file mode 100644 index 0000000..564b633 --- /dev/null +++ b/Source/AgrarianGame/AgrarianPersistenceSubsystem.cpp @@ -0,0 +1,33 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianPersistenceSubsystem.h" +#include "AgrarianSaveGame.h" +#include "Kismet/GameplayStatics.h" + +UAgrarianSaveGame* UAgrarianPersistenceSubsystem::CreateEmptySave() const +{ + return Cast(UGameplayStatics::CreateSaveGameObject(UAgrarianSaveGame::StaticClass())); +} + +UAgrarianSaveGame* UAgrarianPersistenceSubsystem::LoadOrCreateSave() const +{ + if (UGameplayStatics::DoesSaveGameExist(DefaultSlotName, UserIndex)) + { + if (UAgrarianSaveGame* Loaded = Cast(UGameplayStatics::LoadGameFromSlot(DefaultSlotName, UserIndex))) + { + return Loaded; + } + } + + return CreateEmptySave(); +} + +bool UAgrarianPersistenceSubsystem::WriteSave(UAgrarianSaveGame* SaveGame) const +{ + return SaveGame ? UGameplayStatics::SaveGameToSlot(SaveGame, DefaultSlotName, UserIndex) : false; +} + +bool UAgrarianPersistenceSubsystem::DoesSaveExist() const +{ + return UGameplayStatics::DoesSaveGameExist(DefaultSlotName, UserIndex); +} diff --git a/Source/AgrarianGame/AgrarianPersistenceSubsystem.h b/Source/AgrarianGame/AgrarianPersistenceSubsystem.h new file mode 100644 index 0000000..c412d01 --- /dev/null +++ b/Source/AgrarianGame/AgrarianPersistenceSubsystem.h @@ -0,0 +1,34 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Subsystems/GameInstanceSubsystem.h" +#include "AgrarianPersistenceSubsystem.generated.h" + +class UAgrarianSaveGame; + +UCLASS() +class UAgrarianPersistenceSubsystem : public UGameInstanceSubsystem +{ + GENERATED_BODY() + +public: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Persistence") + FString DefaultSlotName = TEXT("AgrarianMVP"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Persistence") + int32 UserIndex = 0; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Persistence") + UAgrarianSaveGame* CreateEmptySave() const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Persistence") + UAgrarianSaveGame* LoadOrCreateSave() const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Persistence") + bool WriteSave(UAgrarianSaveGame* SaveGame) const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Persistence") + bool DoesSaveExist() const; +}; diff --git a/Source/AgrarianGame/AgrarianResourceNode.cpp b/Source/AgrarianGame/AgrarianResourceNode.cpp new file mode 100644 index 0000000..b550344 --- /dev/null +++ b/Source/AgrarianGame/AgrarianResourceNode.cpp @@ -0,0 +1,71 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianResourceNode.h" +#include "AgrarianGameCharacter.h" +#include "AgrarianInventoryComponent.h" +#include "Components/StaticMeshComponent.h" +#include "Net/UnrealNetwork.h" + +AAgrarianResourceNode::AAgrarianResourceNode() +{ + bReplicates = true; + + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + RootComponent = Mesh; + Mesh->SetCollisionProfileName(TEXT("BlockAll")); + + YieldItem.ItemId = TEXT("wood"); + YieldItem.DisplayName = FText::FromString(TEXT("Wood")); + YieldItem.Quantity = 1; + YieldItem.UnitWeight = 1.0f; +} + +void AAgrarianResourceNode::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(AAgrarianResourceNode, RemainingHarvests); +} + +FText AAgrarianResourceNode::GetInteractionText_Implementation(const AAgrarianGameCharacter* Interactor) const +{ + return RemainingHarvests > 0 ? FText::FromString(TEXT("Gather")) : FText::FromString(TEXT("Depleted")); +} + +bool AAgrarianResourceNode::CanInteract_Implementation(const AAgrarianGameCharacter* Interactor) const +{ + return RemainingHarvests > 0 && Interactor != nullptr; +} + +void AAgrarianResourceNode::Interact_Implementation(AAgrarianGameCharacter* Interactor) +{ + if (!HasAuthority() || !Interactor || RemainingHarvests <= 0) + { + return; + } + + if (UAgrarianInventoryComponent* Inventory = Interactor->GetInventoryComponent()) + { + FAgrarianItemStack Granted = YieldItem; + Granted.Quantity = QuantityPerHarvest; + + if (Inventory->AddItem(Granted)) + { + RemainingHarvests--; + UpdateDepletedState(); + } + } +} + +void AAgrarianResourceNode::OnRep_RemainingHarvests() +{ + UpdateDepletedState(); +} + +void AAgrarianResourceNode::UpdateDepletedState() +{ + if (Mesh) + { + Mesh->SetVisibility(RemainingHarvests > 0, true); + Mesh->SetCollisionEnabled(RemainingHarvests > 0 ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision); + } +} diff --git a/Source/AgrarianGame/AgrarianResourceNode.h b/Source/AgrarianGame/AgrarianResourceNode.h new file mode 100644 index 0000000..52de0ea --- /dev/null +++ b/Source/AgrarianGame/AgrarianResourceNode.h @@ -0,0 +1,44 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "AgrarianInteractable.h" +#include "AgrarianTypes.h" +#include "AgrarianResourceNode.generated.h" + +class UStaticMeshComponent; + +UCLASS(Blueprintable) +class AAgrarianResourceNode : public AActor, public IAgrarianInteractable +{ + GENERATED_BODY() + +public: + AAgrarianResourceNode(); + + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Resource") + TObjectPtr Mesh; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Resource") + FAgrarianItemStack YieldItem; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing = OnRep_RemainingHarvests, Category = "Agrarian|Resource", meta = (ClampMin = "0")) + int32 RemainingHarvests = 5; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Resource", meta = (ClampMin = "1")) + int32 QuantityPerHarvest = 1; + + virtual FText GetInteractionText_Implementation(const AAgrarianGameCharacter* Interactor) const override; + virtual bool CanInteract_Implementation(const AAgrarianGameCharacter* Interactor) const override; + virtual void Interact_Implementation(AAgrarianGameCharacter* Interactor) override; + +protected: + UFUNCTION() + void OnRep_RemainingHarvests(); + + void UpdateDepletedState(); +}; diff --git a/Source/AgrarianGame/AgrarianSaveGame.cpp b/Source/AgrarianGame/AgrarianSaveGame.cpp new file mode 100644 index 0000000..bf11cee --- /dev/null +++ b/Source/AgrarianGame/AgrarianSaveGame.cpp @@ -0,0 +1,3 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianSaveGame.h" diff --git a/Source/AgrarianGame/AgrarianSaveGame.h b/Source/AgrarianGame/AgrarianSaveGame.h new file mode 100644 index 0000000..c55b678 --- /dev/null +++ b/Source/AgrarianGame/AgrarianSaveGame.h @@ -0,0 +1,66 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/SaveGame.h" +#include "AgrarianTypes.h" +#include "AgrarianSaveGame.generated.h" + +USTRUCT(BlueprintType) +struct FAgrarianSavedPlayer +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + FString PlayerId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + FTransform Transform; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + FAgrarianSurvivalSnapshot Survival; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + TArray Inventory; +}; + +USTRUCT(BlueprintType) +struct FAgrarianSavedWorldActor +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + FName ActorTypeId = NAME_None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + FTransform Transform; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + TMap StringState; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + TMap NumberState; +}; + +UCLASS() +class UAgrarianSaveGame : public USaveGame +{ + GENERATED_BODY() + +public: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + int32 SaveVersion = 1; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + float WorldHours = 8.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + EAgrarianWeatherType Weather = EAgrarianWeatherType::Clear; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + TArray Players; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Save") + TArray WorldActors; +}; diff --git a/Source/AgrarianGame/AgrarianShelterActor.cpp b/Source/AgrarianGame/AgrarianShelterActor.cpp new file mode 100644 index 0000000..48033a8 --- /dev/null +++ b/Source/AgrarianGame/AgrarianShelterActor.cpp @@ -0,0 +1,18 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianShelterActor.h" +#include "Components/BoxComponent.h" +#include "Components/StaticMeshComponent.h" + +AAgrarianShelterActor::AAgrarianShelterActor() +{ + bReplicates = true; + + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + RootComponent = Mesh; + + ProtectionVolume = CreateDefaultSubobject(TEXT("ProtectionVolume")); + ProtectionVolume->SetupAttachment(RootComponent); + ProtectionVolume->SetBoxExtent(FVector(250.0f, 250.0f, 180.0f)); + ProtectionVolume->SetCollisionProfileName(TEXT("OverlapAllDynamic")); +} diff --git a/Source/AgrarianGame/AgrarianShelterActor.h b/Source/AgrarianGame/AgrarianShelterActor.h new file mode 100644 index 0000000..2ded45a --- /dev/null +++ b/Source/AgrarianGame/AgrarianShelterActor.h @@ -0,0 +1,28 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "AgrarianShelterActor.generated.h" + +class UBoxComponent; +class UStaticMeshComponent; + +UCLASS(Blueprintable) +class AAgrarianShelterActor : public AActor +{ + GENERATED_BODY() + +public: + AAgrarianShelterActor(); + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Shelter") + TObjectPtr Mesh; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Agrarian|Shelter") + TObjectPtr ProtectionVolume; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Shelter", meta = (ClampMin = "0", ClampMax = "1")) + float WeatherProtection = 0.65f; +}; diff --git a/Source/AgrarianGame/AgrarianSurvivalComponent.cpp b/Source/AgrarianGame/AgrarianSurvivalComponent.cpp new file mode 100644 index 0000000..9e45236 --- /dev/null +++ b/Source/AgrarianGame/AgrarianSurvivalComponent.cpp @@ -0,0 +1,163 @@ +// Copyright Pacificao. All Rights Reserved. + +#include "AgrarianSurvivalComponent.h" +#include "AgrarianGameState.h" +#include "Engine/World.h" +#include "Net/UnrealNetwork.h" + +UAgrarianSurvivalComponent::UAgrarianSurvivalComponent() +{ + PrimaryComponentTick.bCanEverTick = true; + SetIsReplicatedByDefault(true); +} + +void UAgrarianSurvivalComponent::BeginPlay() +{ + Super::BeginPlay(); + ClampSurvival(); + BroadcastSurvivalChanged(); +} + +void UAgrarianSurvivalComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + + if (!GetOwner() || !GetOwner()->HasAuthority() || !IsAlive()) + { + return; + } + + const float Minutes = DeltaTime / 60.0f; + Survival.Hunger -= HungerDecayPerMinute * Minutes; + Survival.Thirst -= ThirstDecayPerMinute * Minutes; + Survival.Stamina += StaminaRecoveryPerSecond * DeltaTime; + + if (const UWorld* World = GetWorld()) + { + if (const AAgrarianGameState* AgrarianGameState = World->GetGameState()) + { + const float ExposureDelta = (AgrarianGameState->AmbientTemperatureC - 18.0f) * 0.002f * DeltaTime; + Survival.BodyTemperature += FMath::Clamp(ExposureDelta, -0.035f, 0.02f); + } + } + + if (Survival.Hunger <= 0.0f) + { + Survival.Health -= StarvationDamagePerMinute * Minutes; + } + + if (Survival.Thirst <= 0.0f) + { + Survival.Health -= DehydrationDamagePerMinute * Minutes; + } + + if (Survival.BodyTemperature < 35.0f) + { + Survival.Health -= ColdDamagePerMinute * Minutes; + } + + ClampSurvival(); + BroadcastSurvivalChanged(); +} + +void UAgrarianSurvivalComponent::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(UAgrarianSurvivalComponent, Survival); +} + +bool UAgrarianSurvivalComponent::IsAlive() const +{ + return Survival.Health > 0.0f; +} + +void UAgrarianSurvivalComponent::ApplyDamage(float Amount) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.Health -= FMath::Max(0.0f, Amount); + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::RestoreHealth(float Amount) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.Health += FMath::Max(0.0f, Amount); + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::AddFood(float Amount) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.Hunger += FMath::Max(0.0f, Amount); + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::AddWater(float Amount) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.Thirst += FMath::Max(0.0f, Amount); + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::AddWarmth(float DegreesCelsius) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.BodyTemperature += DegreesCelsius; + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::AddInjury(float Severity) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.InjurySeverity += FMath::Max(0.0f, Severity); + Survival.Health -= Severity * 5.0f; + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::SpendStamina(float Amount) +{ + if (GetOwner() && GetOwner()->HasAuthority()) + { + Survival.Stamina -= FMath::Max(0.0f, Amount); + ClampSurvival(); + BroadcastSurvivalChanged(); + } +} + +void UAgrarianSurvivalComponent::OnRep_Survival() +{ + BroadcastSurvivalChanged(); +} + +void UAgrarianSurvivalComponent::ClampSurvival() +{ + Survival.Health = FMath::Clamp(Survival.Health, 0.0f, 100.0f); + Survival.Stamina = FMath::Clamp(Survival.Stamina, 0.0f, 100.0f); + Survival.Hunger = FMath::Clamp(Survival.Hunger, 0.0f, 100.0f); + Survival.Thirst = FMath::Clamp(Survival.Thirst, 0.0f, 100.0f); + Survival.BodyTemperature = FMath::Clamp(Survival.BodyTemperature, 30.0f, 42.0f); + Survival.InjurySeverity = FMath::Clamp(Survival.InjurySeverity, 0.0f, 100.0f); +} + +void UAgrarianSurvivalComponent::BroadcastSurvivalChanged() +{ + OnSurvivalChanged.Broadcast(Survival); +} diff --git a/Source/AgrarianGame/AgrarianSurvivalComponent.h b/Source/AgrarianGame/AgrarianSurvivalComponent.h new file mode 100644 index 0000000..cca3c0f --- /dev/null +++ b/Source/AgrarianGame/AgrarianSurvivalComponent.h @@ -0,0 +1,78 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "AgrarianTypes.h" +#include "AgrarianSurvivalComponent.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAgrarianSurvivalChangedSignature, const FAgrarianSurvivalSnapshot&, Snapshot); + +UCLASS(ClassGroup = (Agrarian), BlueprintType, Blueprintable, meta = (BlueprintSpawnableComponent)) +class UAgrarianSurvivalComponent : public UActorComponent +{ + GENERATED_BODY() + +public: + UAgrarianSurvivalComponent(); + + virtual void BeginPlay() override; + virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; + + UPROPERTY(BlueprintAssignable, Category = "Agrarian|Survival") + FAgrarianSurvivalChangedSignature OnSurvivalChanged; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing = OnRep_Survival, Category = "Agrarian|Survival") + FAgrarianSurvivalSnapshot Survival; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) + float HungerDecayPerMinute = 0.55f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) + float ThirstDecayPerMinute = 0.85f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) + float StaminaRecoveryPerSecond = 14.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) + float StarvationDamagePerMinute = 3.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) + float DehydrationDamagePerMinute = 5.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) + float ColdDamagePerMinute = 4.0f; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + bool IsAlive() const; + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void ApplyDamage(float Amount); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void RestoreHealth(float Amount); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void AddFood(float Amount); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void AddWater(float Amount); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void AddWarmth(float DegreesCelsius); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void AddInjury(float Severity); + + UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") + void SpendStamina(float Amount); + +protected: + UFUNCTION() + void OnRep_Survival(); + + void ClampSurvival(); + void BroadcastSurvivalChanged(); +}; diff --git a/Source/AgrarianGame/AgrarianTypes.h b/Source/AgrarianGame/AgrarianTypes.h new file mode 100644 index 0000000..0f11655 --- /dev/null +++ b/Source/AgrarianGame/AgrarianTypes.h @@ -0,0 +1,121 @@ +// Copyright Pacificao. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "AgrarianTypes.generated.h" + +UENUM(BlueprintType) +enum class EAgrarianWeatherType : uint8 +{ + Clear UMETA(DisplayName = "Clear"), + Rain UMETA(DisplayName = "Rain"), + ColdWind UMETA(DisplayName = "Cold Wind"), + Storm UMETA(DisplayName = "Storm") +}; + +USTRUCT(BlueprintType) +struct FAgrarianItemStack +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Inventory") + FName ItemId = NAME_None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Inventory") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Inventory", meta = (ClampMin = "0")) + int32 Quantity = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Inventory", meta = (ClampMin = "0")) + float UnitWeight = 0.0f; + + bool IsValidStack() const + { + return ItemId != NAME_None && Quantity > 0; + } +}; + +UENUM(BlueprintType) +enum class EAgrarianItemType : uint8 +{ + Resource UMETA(DisplayName = "Resource"), + Food UMETA(DisplayName = "Food"), + Tool UMETA(DisplayName = "Tool"), + Structure UMETA(DisplayName = "Structure"), + Medicine UMETA(DisplayName = "Medicine"), + Currency UMETA(DisplayName = "Currency") +}; + +USTRUCT(BlueprintType) +struct FAgrarianItemDefinition +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Items") + FName ItemId = NAME_None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Items") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Items") + FText Description; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Items") + EAgrarianItemType ItemType = EAgrarianItemType::Resource; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Items", meta = (ClampMin = "0")) + float UnitWeight = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Items", meta = (ClampMin = "1")) + int32 MaxStackSize = 99; +}; + +USTRUCT(BlueprintType) +struct FAgrarianRecipe +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting") + FName RecipeId = NAME_None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting") + FText DisplayName; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting") + TArray Ingredients; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting") + FAgrarianItemStack Result; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting", meta = (ClampMin = "0")) + float CraftSeconds = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Crafting") + bool bRequiresCampfire = false; +}; + +USTRUCT(BlueprintType) +struct FAgrarianSurvivalSnapshot +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival") + float Health = 100.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival") + float Stamina = 100.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival") + float Hunger = 100.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival") + float Thirst = 100.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival") + float BodyTemperature = 37.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival") + float InjurySeverity = 0.0f; +}; diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatAIController.cpp b/Source/AgrarianGame/Variant_Combat/AI/CombatAIController.cpp new file mode 100644 index 0000000..0ef8de1 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatAIController.cpp @@ -0,0 +1,19 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatAIController.h" +#include "Components/StateTreeAIComponent.h" + +ACombatAIController::ACombatAIController() +{ + // create the StateTree AI Component + StateTreeAI = CreateDefaultSubobject(TEXT("StateTreeAI")); + check(StateTreeAI); + + // ensure we start the StateTree when we possess the pawn + bStartAILogicOnPossess = true; + + // ensure we're attached to the possessed character. + // this is necessary for EnvQueries to work correctly + bAttachToPawn = true; +} diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatAIController.h b/Source/AgrarianGame/Variant_Combat/AI/CombatAIController.h new file mode 100644 index 0000000..6da1d69 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatAIController.h @@ -0,0 +1,27 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "AIController.h" +#include "CombatAIController.generated.h" + +class UStateTreeAIComponent; + +/** + * A basic AI Controller capable of running StateTree + */ +UCLASS(abstract) +class ACombatAIController : public AAIController +{ + GENERATED_BODY() + + /** StateTree Component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + UStateTreeAIComponent* StateTreeAI; + +public: + + /** Constructor */ + ACombatAIController(); +}; diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatEnemy.cpp b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemy.cpp new file mode 100644 index 0000000..393957f --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemy.cpp @@ -0,0 +1,343 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatEnemy.h" +#include "Components/CapsuleComponent.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "CombatAIController.h" +#include "Components/WidgetComponent.h" +#include "Engine/DamageEvents.h" +#include "CombatLifeBar.h" +#include "TimerManager.h" +#include "Components/SkeletalMeshComponent.h" +#include "Animation/AnimInstance.h" + +ACombatEnemy::ACombatEnemy() +{ + PrimaryActorTick.bCanEverTick = true; + + // bind the attack montage ended delegate + OnAttackMontageEnded.BindUObject(this, &ACombatEnemy::AttackMontageEnded); + + // set the AI Controller class by default + AIControllerClass = ACombatAIController::StaticClass(); + + // use an AI Controller regardless of whether we're placed or spawned + AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; + + // ignore the controller's yaw rotation + bUseControllerRotationYaw = false; + + // create the life bar + LifeBar = CreateDefaultSubobject(TEXT("LifeBar")); + LifeBar->SetupAttachment(RootComponent); + + // set the collision capsule size + GetCapsuleComponent()->SetCapsuleSize(35.0f, 90.0f); + + // set the character movement properties + GetCharacterMovement()->bUseControllerDesiredRotation = true; + + // reset HP to maximum + CurrentHP = MaxHP; +} + +void ACombatEnemy::DoAIComboAttack() +{ + // ignore if we're already playing an attack animation + if (bIsAttacking) + { + return; + } + + // raise the attacking flag + bIsAttacking = true; + + // choose how many times we're going to attack + TargetComboCount = FMath::RandRange(1, ComboSectionNames.Num() - 1); + + // reset the attack counter + CurrentComboAttack = 0; + + // play the attack montage + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + const float MontageLength = AnimInstance->Montage_Play(ComboAttackMontage, 1.0f, EMontagePlayReturnType::MontageLength, 0.0f, true); + + // subscribe to montage completed and interrupted events + if (MontageLength > 0.0f) + { + // set the end delegate for the montage + AnimInstance->Montage_SetEndDelegate(OnAttackMontageEnded, ComboAttackMontage); + } + } +} + +void ACombatEnemy::DoAIChargedAttack() +{ + // ignore if we're already playing an attack animation + if (bIsAttacking) + { + return; + } + + // raise the attacking flag + bIsAttacking = true; + + // choose how many loops are we going to charge for + TargetChargeLoops = FMath::RandRange(MinChargeLoops, MaxChargeLoops); + + // reset the charge loop counter + CurrentChargeLoop = 0; + + // play the attack montage + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + const float MontageLength = AnimInstance->Montage_Play(ChargedAttackMontage, 1.0f, EMontagePlayReturnType::MontageLength, 0.0f, true); + + // subscribe to montage completed and interrupted events + if (MontageLength > 0.0f) + { + // set the end delegate for the montage + AnimInstance->Montage_SetEndDelegate(OnAttackMontageEnded, ChargedAttackMontage); + } + } +} + +void ACombatEnemy::AttackMontageEnded(UAnimMontage* Montage, bool bInterrupted) +{ + // reset the attacking flag + bIsAttacking = false; + + // call the attack completed delegate so the StateTree can continue execution + OnAttackCompleted.ExecuteIfBound(); +} + +const FVector& ACombatEnemy::GetLastDangerLocation() const +{ + return LastDangerLocation; +} + +float ACombatEnemy::GetLastDangerTime() const +{ + return LastDangerTime; +} + +void ACombatEnemy::DoAttackTrace(FName DamageSourceBone) +{ + // sweep for objects in front of the character to be hit by the attack + TArray OutHits; + + // start at the provided socket location, sweep forward + const FVector TraceStart = GetMesh()->GetSocketLocation(DamageSourceBone); + const FVector TraceEnd = TraceStart + (GetActorForwardVector() * MeleeTraceDistance); + + // enemies only affect Pawn collision objects; they don't knock back boxes + FCollisionObjectQueryParams ObjectParams; + ObjectParams.AddObjectTypesToQuery(ECC_Pawn); + + // use a sphere shape for the sweep + FCollisionShape CollisionShape; + CollisionShape.SetSphere(MeleeTraceRadius); + + // ignore self + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + if (GetWorld()->SweepMultiByObjectType(OutHits, TraceStart, TraceEnd, FQuat::Identity, ObjectParams, CollisionShape, QueryParams)) + { + // iterate over each object hit + for (const FHitResult& CurrentHit : OutHits) + { + /** does the actor have the player tag? */ + if (CurrentHit.GetActor()->ActorHasTag(FName("Player"))) + { + // check if the actor is damageable + ICombatDamageable* Damageable = Cast(CurrentHit.GetActor()); + + if (Damageable) + { + // knock upwards and away from the impact normal + const FVector Impulse = (CurrentHit.ImpactNormal * -MeleeKnockbackImpulse) + (FVector::UpVector * MeleeLaunchImpulse); + + // pass the damage event to the actor + Damageable->ApplyDamage(MeleeDamage, this, CurrentHit.ImpactPoint, Impulse); + + } + } + } + } +} + +void ACombatEnemy::CheckCombo() +{ + // increase the combo counter + ++CurrentComboAttack; + + // do we still have attacks to play in this string? + if (CurrentComboAttack < TargetComboCount) + { + // jump to the next attack section + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + AnimInstance->Montage_JumpToSection(ComboSectionNames[CurrentComboAttack], ComboAttackMontage); + } + } +} + +void ACombatEnemy::CheckChargedAttack() +{ + // increase the charge loop counter + ++CurrentChargeLoop; + + // jump to either the loop or attack section of the montage depending on whether we hit the loop target + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + AnimInstance->Montage_JumpToSection(CurrentChargeLoop >= TargetChargeLoops ? ChargeAttackSection : ChargeLoopSection, ChargedAttackMontage); + } +} + +void ACombatEnemy::ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) +{ + + // pass the damage event to the actor + FDamageEvent DamageEvent; + const float ActualDamage = TakeDamage(Damage, DamageEvent, nullptr, DamageCauser); + + // only process knockback and effects if we received nonzero damage + if (ActualDamage > 0.0f) + { + // apply the knockback impulse + GetCharacterMovement()->AddImpulse(DamageImpulse, true); + + // is the character ragdolling? + if (GetMesh()->IsSimulatingPhysics()) + { + // apply an impulse to the ragdoll + GetMesh()->AddImpulseAtLocation(DamageImpulse * GetMesh()->GetMass(), DamageLocation); + } + + // stop the attack montages to interrupt the attack + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + AnimInstance->Montage_Stop(0.1f, ComboAttackMontage); + AnimInstance->Montage_Stop(0.1f, ChargedAttackMontage); + } + + // pass control to BP to play effects, etc. + ReceivedDamage(ActualDamage, DamageLocation, DamageImpulse.GetSafeNormal()); + } +} + +void ACombatEnemy::HandleDeath() +{ + // hide the life bar + LifeBar->SetHiddenInGame(true); + + // disable the collision capsule to avoid being hit again while dead + GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision); + + // disable character movement + GetCharacterMovement()->DisableMovement(); + + // enable full ragdoll physics + GetMesh()->SetSimulatePhysics(true); + + // call the died delegate to notify any subscribers + OnEnemyDied.Broadcast(); + + // set up the death timer + GetWorld()->GetTimerManager().SetTimer(DeathTimer, this, &ACombatEnemy::RemoveFromLevel, DeathRemovalTime); +} + +void ACombatEnemy::ApplyHealing(float Healing, AActor* Healer) +{ + // stub +} + +void ACombatEnemy::NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) +{ + // ensure we're being attacked by the player + if (DangerSource && DangerSource->ActorHasTag(FName("Player"))) + { + // save the danger location and game time + LastDangerLocation = DangerLocation; + LastDangerTime = GetWorld()->GetTimeSeconds(); + } +} + +void ACombatEnemy::RemoveFromLevel() +{ + // destroy this actor + Destroy(); +} + +float ACombatEnemy::TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) +{ + // only process damage if the character is still alive + if (CurrentHP <= 0.0f) + { + return 0.0f; + } + + // reduce the current HP + CurrentHP -= Damage; + + // have we run out of HP? + if (CurrentHP <= 0.0f) + { + // die + HandleDeath(); + } + else + { + // update the life bar + LifeBarWidget->SetLifePercentage(CurrentHP / MaxHP); + + // enable partial ragdoll physics, but keep the pelvis vertical + GetMesh()->SetPhysicsBlendWeight(0.5f); + GetMesh()->SetBodySimulatePhysics(PelvisBoneName, false); + } + + // return the received damage amount + return Damage; +} + +void ACombatEnemy::Landed(const FHitResult& Hit) +{ + Super::Landed(Hit); + + // is the character still alive? + if (CurrentHP >= 0.0f) + { + // disable ragdoll physics + GetMesh()->SetPhysicsBlendWeight(0.0f); + } + + // call the landed Delegate for StateTree + OnEnemyLanded.ExecuteIfBound(); +} + +void ACombatEnemy::BeginPlay() +{ + // reset HP to maximum + CurrentHP = MaxHP; + + // we top the HP before BeginPlay so StateTree picks it up at the right value + Super::BeginPlay(); + + // get the life bar widget from the widget comp + LifeBarWidget = Cast(LifeBar->GetUserWidgetObject()); + check(LifeBarWidget); + + // fill the life bar + LifeBarWidget->SetLifePercentage(1.0f); +} + +void ACombatEnemy::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the death timer + GetWorld()->GetTimerManager().ClearTimer(DeathTimer); +} diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatEnemy.h b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemy.h new file mode 100644 index 0000000..1a4a99d --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemy.h @@ -0,0 +1,232 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "CombatAttacker.h" +#include "CombatDamageable.h" +#include "Animation/AnimMontage.h" +#include "Engine/TimerHandle.h" +#include "CombatEnemy.generated.h" + +class UWidgetComponent; +class UCombatLifeBar; +class UAnimMontage; + +/** Completed attack animation delegate for StateTree */ +DECLARE_DELEGATE(FOnEnemyAttackCompleted); + +/** Landed delegate for StateTree */ +DECLARE_DELEGATE(FOnEnemyLanded); + +/** Enemy died delegate */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnEnemyDied); + +/** + * An AI-controlled character with combat capabilities. + * Its bundled AI Controller runs logic through StateTree + */ +UCLASS(abstract) +class ACombatEnemy : public ACharacter, public ICombatAttacker, public ICombatDamageable +{ + GENERATED_BODY() + + /** Life bar widget component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UWidgetComponent* LifeBar; + +public: + + /** Constructor */ + ACombatEnemy(); + +protected: + + /** Max amount of HP the character will have on respawn */ + UPROPERTY(EditAnywhere, Category="Damage") + float MaxHP = 3.0f; + +public: + + /** Current amount of HP the character has */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Damage", meta = (ClampMin = 0, ClampMax = 100)) + float CurrentHP = 0.0f; + +protected: + + /** Name of the pelvis bone, for damage ragdoll physics */ + UPROPERTY(EditAnywhere, Category="Damage") + FName PelvisBoneName; + + /** Pointer to the life bar widget */ + UPROPERTY(EditAnywhere, Category="Damage") + UCombatLifeBar* LifeBarWidget; + + /** If true, the character is currently playing an attack animation */ + bool bIsAttacking = false; + + /** Distance ahead of the character that melee attack sphere collision traces will extend */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Trace", meta = (ClampMin = 0, ClampMax = 500, Units = "cm")) + float MeleeTraceDistance = 75.0f; + + /** Radius of the sphere trace for melee attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Trace", meta = (ClampMin = 0, ClampMax = 500, Units = "cm")) + float MeleeTraceRadius = 50.0f; + + /** Amount of damage a melee attack will deal */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Damage", meta = (ClampMin = 0, ClampMax = 100)) + float MeleeDamage = 1.0f; + + /** Amount of knockback impulse a melee attack will apply */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Damage", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm/s")) + float MeleeKnockbackImpulse = 150.0f; + + /** Amount of upwards impulse a melee attack will apply */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Damage", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm/s")) + float MeleeLaunchImpulse = 350.0f; + + /** AnimMontage that will play for combo attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Combo") + UAnimMontage* ComboAttackMontage; + + /** Names of the AnimMontage sections that correspond to each stage of the combo attack */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Combo") + TArray ComboSectionNames; + + /** Target number of attacks in the combo attack string we're playing */ + int32 TargetComboCount = 0; + + /** Index of the current stage of the melee attack combo */ + int32 CurrentComboAttack = 0; + + /** AnimMontage that will play for charged attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged") + UAnimMontage* ChargedAttackMontage; + + /** Name of the AnimMontage section that corresponds to the charge loop */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged") + FName ChargeLoopSection; + + /** Name of the AnimMontage section that corresponds to the attack */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged") + FName ChargeAttackSection; + + /** Minimum number of charge animation loops that will be played by the AI */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged", meta = (ClampMin = 1, ClampMax = 20)) + int32 MinChargeLoops = 2; + + /** Maximum number of charge animation loops that will be played by the AI */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged", meta = (ClampMin = 1, ClampMax = 20)) + int32 MaxChargeLoops = 5; + + /** Target number of charge animation loops to play in this charged attack */ + int32 TargetChargeLoops = 0; + + /** Number of charge animation loop currently playing */ + int32 CurrentChargeLoop = 0; + + /** Time to wait before removing this character from the level after it dies */ + UPROPERTY(EditAnywhere, Category="Death") + float DeathRemovalTime = 5.0f; + + /** Enemy death timer */ + FTimerHandle DeathTimer; + + /** Attack montage ended delegate */ + FOnMontageEnded OnAttackMontageEnded; + + /** Last recorded location we're being attacked from */ + FVector LastDangerLocation = FVector::ZeroVector; + + /** Last recorded game time we were attacked */ + float LastDangerTime = -1000.0f; + +public: + /** Attack completed internal delegate to notify StateTree tasks */ + FOnEnemyAttackCompleted OnAttackCompleted; + + /** Landed internal delegate to notify StateTree tasks. We use this instead of the built-in Landed delegate so we can bind to a Lambda in StateTree tasks */ + FOnEnemyLanded OnEnemyLanded; + + /** Enemy died delegate. Allows external subscribers to respond to enemy death */ + UPROPERTY(BlueprintAssignable, Category="Events") + FOnEnemyDied OnEnemyDied; + +public: + + /** Performs an AI-initiated combo attack. Number of hits will be decided by this character */ + void DoAIComboAttack(); + + /** Performs an AI-initiated charged attack. Charge time will be decided by this character */ + void DoAIChargedAttack(); + + /** Called from a delegate when the attack montage ends */ + void AttackMontageEnded(UAnimMontage* Montage, bool bInterrupted); + + /** Returns the last recorded location we were attacked from */ + const FVector& GetLastDangerLocation() const; + + /** Returns the last game time we were attacked */ + float GetLastDangerTime() const; + +public: + + // ~begin ICombatAttacker interface + + /** Performs an attack's collision check */ + virtual void DoAttackTrace(FName DamageSourceBone) override; + + /** Performs a combo attack's check to continue the string */ + UFUNCTION(BlueprintCallable, Category="Attacker") + virtual void CheckCombo() override; + + /** Performs a charged attack's check to loop the charge animation */ + UFUNCTION(BlueprintCallable, Category="Attacker") + virtual void CheckChargedAttack() override; + + // ~end ICombatAttacker interface + + // ~begin ICombatDamageable interface + + /** Handles damage and knockback events */ + virtual void ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) override; + + /** Handles death events */ + virtual void HandleDeath() override; + + /** Handles healing events */ + virtual void ApplyHealing(float Healing, AActor* Healer) override; + + /** Allows the enemy to react to incoming attacks */ + virtual void NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) override; + + // ~end ICombatDamageable interface + +protected: + + /** Removes this character from the level after it dies */ + void RemoveFromLevel(); + +public: + + /** Overrides the default TakeDamage functionality */ + virtual float TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override; + + /** Overrides landing to reset damage ragdoll physics */ + virtual void Landed(const FHitResult& Hit) override; + +protected: + + /** Blueprint handler to play damage received effects */ + UFUNCTION(BlueprintImplementableEvent, Category="Combat") + void ReceivedDamage(float Damage, const FVector& ImpactPoint, const FVector& DamageDirection); + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** EndPlay cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; +}; diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatEnemySpawner.cpp b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemySpawner.cpp new file mode 100644 index 0000000..b29a858 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemySpawner.cpp @@ -0,0 +1,126 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatEnemySpawner.h" +#include "Engine/World.h" +#include "Components/SceneComponent.h" +#include "Components/CapsuleComponent.h" +#include "Components/ArrowComponent.h" +#include "TimerManager.h" +#include "CombatEnemy.h" + +ACombatEnemySpawner::ACombatEnemySpawner() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the root + RootComponent = CreateDefaultSubobject(TEXT("Root")); + + // create the reference spawn capsule + SpawnCapsule = CreateDefaultSubobject(TEXT("Spawn Capsule")); + SpawnCapsule->SetupAttachment(RootComponent); + + SpawnCapsule->SetRelativeLocation(FVector(0.0f, 0.0f, 90.0f)); + SpawnCapsule->SetCapsuleSize(35.0f, 90.0f); + SpawnCapsule->SetCollisionProfileName(FName("NoCollision")); + + SpawnDirection = CreateDefaultSubobject(TEXT("Spawn Direction")); + SpawnDirection->SetupAttachment(RootComponent); +} + +void ACombatEnemySpawner::BeginPlay() +{ + Super::BeginPlay(); + + // should we spawn an enemy right away? + if (bShouldSpawnEnemiesImmediately) + { + // schedule the first enemy spawn + GetWorld()->GetTimerManager().SetTimer(SpawnTimer, this, &ACombatEnemySpawner::SpawnEnemy, InitialSpawnDelay); + } + +} + +void ACombatEnemySpawner::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the spawn timer + GetWorld()->GetTimerManager().ClearTimer(SpawnTimer); +} + +void ACombatEnemySpawner::SpawnEnemy() +{ + // ensure the enemy class is valid + if (IsValid(EnemyClass)) + { + // spawn the enemy at the reference capsule's transform + FActorSpawnParameters SpawnParams; + SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn; + + ACombatEnemy* SpawnedEnemy = GetWorld()->SpawnActor(EnemyClass, SpawnCapsule->GetComponentTransform(), SpawnParams); + + // was the enemy successfully created? + if (SpawnedEnemy) + { + // subscribe to the death delegate + SpawnedEnemy->OnEnemyDied.AddDynamic(this, &ACombatEnemySpawner::OnEnemyDied); + } + } +} + +void ACombatEnemySpawner::OnEnemyDied() +{ + // decrease the spawn counter + --SpawnCount; + + // is this the last enemy we should spawn? + if (SpawnCount <= 0) + { + // schedule the activation on depleted message + GetWorld()->GetTimerManager().SetTimer(SpawnTimer, this, &ACombatEnemySpawner::SpawnerDepleted, ActivationDelay); + return; + } + + // schedule the next enemy spawn + GetWorld()->GetTimerManager().SetTimer(SpawnTimer, this, &ACombatEnemySpawner::SpawnEnemy, RespawnDelay); +} + +void ACombatEnemySpawner::SpawnerDepleted() +{ + // process the actors to activate list + for (AActor* CurrentActor : ActorsToActivateWhenDepleted) + { + // check if the actor is activatable + if (ICombatActivatable* CombatActivatable = Cast(CurrentActor)) + { + // activate the actor + CombatActivatable->ActivateInteraction(this); + } + } +} + +void ACombatEnemySpawner::ToggleInteraction(AActor* ActivationInstigator) +{ + // stub +} + +void ACombatEnemySpawner::ActivateInteraction(AActor* ActivationInstigator) +{ + // ensure we're only activated once, and only if we've deferred enemy spawning + if (bHasBeenActivated || bShouldSpawnEnemiesImmediately) + { + return; + } + + // raise the activation flag + bHasBeenActivated = true; + + // spawn the first enemy + SpawnEnemy(); +} + +void ACombatEnemySpawner::DeactivateInteraction(AActor* ActivationInstigator) +{ + // stub +} diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatEnemySpawner.h b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemySpawner.h new file mode 100644 index 0000000..ca9eae5 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatEnemySpawner.h @@ -0,0 +1,109 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "CombatActivatable.h" +#include "CombatEnemySpawner.generated.h" + +class UCapsuleComponent; +class UArrowComponent; +class ACombatEnemy; + +/** + * A basic Actor in charge of spawning Enemy Characters and monitoring their deaths. + * Enemies will be spawned one by one, and the spawner will wait until the enemy dies before spawning a new one. + * The spawner can be remotely activated through the ICombatActivatable interface + * When the last spawned enemy dies, the spawner can also activate other ICombatActivatables + */ +UCLASS(abstract) +class ACombatEnemySpawner : public AActor, public ICombatActivatable +{ + GENERATED_BODY() + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UCapsuleComponent* SpawnCapsule; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + UArrowComponent* SpawnDirection; + +protected: + + /** Type of enemy to spawn */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Enemy Spawner") + TSubclassOf EnemyClass; + + /** If true, the first enemy will be spawned as soon as the game starts */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Enemy Spawner") + bool bShouldSpawnEnemiesImmediately = true; + + /** Time to wait before spawning the first enemy on game start */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Enemy Spawner", meta = (ClampMin = 0, ClampMax = 10)) + float InitialSpawnDelay = 5.0f; + + /** Number of enemies to spawn */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Enemy Spawner", meta = (ClampMin = 0, ClampMax = 100)) + int32 SpawnCount = 1; + + /** Time to wait before spawning the next enemy after the current one dies */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Enemy Spawner", meta = (ClampMin = 0, ClampMax = 10)) + float RespawnDelay = 5.0f; + + /** Time to wait after this spawner is depleted before activating the actor list */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Activation", meta = (ClampMin = 0, ClampMax = 10)) + float ActivationDelay = 1.0f; + + /** List of actors to activate after the last enemy dies */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Activation") + TArray ActorsToActivateWhenDepleted; + + /** Flag to ensure this is only activated once */ + bool bHasBeenActivated = false; + + /** Timer to spawn enemies after a delay */ + FTimerHandle SpawnTimer; + +public: + + /** Constructor */ + ACombatEnemySpawner(); + +public: + + /** Initialization */ + virtual void BeginPlay() override; + + /** Cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + +protected: + + /** Spawn an enemy and subscribe to its death event */ + void SpawnEnemy(); + + /** Called when the spawned enemy has died */ + UFUNCTION() + void OnEnemyDied(); + + /** Called after the last spawned enemy has died */ + void SpawnerDepleted(); + +public: + + // ~begin ICombatActivatable interface + + /** Toggles the Spawner */ + UFUNCTION(BlueprintCallable, Category="Activatable") + virtual void ToggleInteraction(AActor* ActivationInstigator) override; + + /** Activates the Spawner */ + UFUNCTION(BlueprintCallable, Category="Activatable") + virtual void ActivateInteraction(AActor* ActivationInstigator) override; + + /** Deactivates the Spawner */ + UFUNCTION(BlueprintCallable, Category="Activatable") + virtual void DeactivateInteraction(AActor* ActivationInstigator) override; + + // ~end IActivatable interface +}; diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatStateTreeUtility.cpp b/Source/AgrarianGame/Variant_Combat/AI/CombatStateTreeUtility.cpp new file mode 100644 index 0000000..82dacc1 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatStateTreeUtility.cpp @@ -0,0 +1,325 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatStateTreeUtility.h" +#include "StateTreeExecutionContext.h" +#include "StateTreeExecutionTypes.h" +#include "Engine/World.h" +#include "GameFramework/Character.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "AIController.h" +#include "CombatEnemy.h" +#include "Kismet/GameplayStatics.h" +#include "StateTreeAsyncExecutionContext.h" + +bool FStateTreeCharacterGroundedCondition::TestCondition(FStateTreeExecutionContext& Context) const +{ + const FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // is the character currently grounded? + bool bCondition = InstanceData.Character->GetMovementComponent()->IsMovingOnGround(); + + return InstanceData.bMustBeOnAir ? !bCondition : bCondition; +} + +#if WITH_EDITOR +FText FStateTreeCharacterGroundedCondition::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Is Character Grounded"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +bool FStateTreeIsInDangerCondition::TestCondition(FStateTreeExecutionContext& Context) const +{ + const FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // ensure we have a valid enemy character + if (InstanceData.Character) + { + // is the last detected danger event within the reaction threshold? + const float ReactionDelta = InstanceData.Character->GetWorld()->GetTimeSeconds() - InstanceData.Character->GetLastDangerTime(); + + if (ReactionDelta < InstanceData.MaxReactionTime && ReactionDelta > InstanceData.MinReactionTime) + { + // do a dot product check to determine if the danger location is within the character's detection cone + const FVector DangerDir = (InstanceData.Character->GetLastDangerLocation() - InstanceData.Character->GetActorLocation()).GetSafeNormal2D(); + + const float DangerDot = FVector::DotProduct(DangerDir, InstanceData.Character->GetActorForwardVector()); + const float ConeAngleCos = FMath::Cos(FMath::DegreesToRadians(InstanceData.DangerSightConeAngle)); + + return DangerDot > ConeAngleCos; + } + } + + return false; +} + +#if WITH_EDITOR +FText FStateTreeIsInDangerCondition::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Is Character In Danger"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeComboAttackTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // bind to the on attack completed delegate + InstanceData.Character->OnAttackCompleted.BindLambda( + [WeakContext = Context.MakeWeakExecutionContext()]() + { + WeakContext.FinishTask(EStateTreeFinishTaskType::Succeeded); + } + ); + + + // tell the character to do a combo attack + InstanceData.Character->DoAIComboAttack(); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeComboAttackTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // unbind the on attack completed delegate + InstanceData.Character->OnAttackCompleted.Unbind(); + } +} + +#if WITH_EDITOR +FText FStateTreeComboAttackTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Do Combo Attack"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeChargedAttackTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // bind to the on attack completed delegate + InstanceData.Character->OnAttackCompleted.BindLambda( + [WeakContext = Context.MakeWeakExecutionContext()]() + { + WeakContext.FinishTask(EStateTreeFinishTaskType::Succeeded); + } + ); + + // tell the character to do a charged attack + InstanceData.Character->DoAIChargedAttack(); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeChargedAttackTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // unbind the on attack completed delegate + InstanceData.Character->OnAttackCompleted.Unbind(); + } +} + +#if WITH_EDITOR +FText FStateTreeChargedAttackTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Do Charged Attack"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeWaitForLandingTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // bind to the on enemy landed delegate + InstanceData.Character->OnEnemyLanded.BindLambda( + [WeakContext = Context.MakeWeakExecutionContext()]() + { + WeakContext.FinishTask(EStateTreeFinishTaskType::Succeeded); + } + ); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeWaitForLandingTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // unbind the on enemy landed delegate + InstanceData.Character->OnEnemyLanded.Unbind(); + } +} + +#if WITH_EDITOR +FText FStateTreeWaitForLandingTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Wait for Landing"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeFaceActorTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // set the AI Controller's focus + InstanceData.Controller->SetFocus(InstanceData.ActorToFaceTowards); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeFaceActorTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // clear the AI Controller's focus + InstanceData.Controller->ClearFocus(EAIFocusPriority::Gameplay); + } +} + +#if WITH_EDITOR +FText FStateTreeFaceActorTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Face Towards Actor"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeFaceLocationTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // set the AI Controller's focus + InstanceData.Controller->SetFocalPoint(InstanceData.FaceLocation); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeFaceLocationTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // clear the AI Controller's focus + InstanceData.Controller->ClearFocus(EAIFocusPriority::Gameplay); + } +} + +#if WITH_EDITOR +FText FStateTreeFaceLocationTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Face Towards Location"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeSetCharacterSpeedTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // set the character's max ground speed + InstanceData.Character->GetCharacterMovement()->MaxWalkSpeed = InstanceData.Speed; + } + + return EStateTreeRunStatus::Running; +} + +#if WITH_EDITOR +FText FStateTreeSetCharacterSpeedTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Set Character Speed"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeGetPlayerInfoTask::Tick(FStateTreeExecutionContext& Context, const float DeltaTime) const +{ + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // get the character possessed by the first local player + InstanceData.TargetPlayerCharacter = Cast(UGameplayStatics::GetPlayerPawn(InstanceData.Character, 0)); + + // do we have a valid target? + if (InstanceData.TargetPlayerCharacter) + { + // update the last known location + InstanceData.TargetPlayerLocation = InstanceData.TargetPlayerCharacter->GetActorLocation(); + } + + // update the distance + InstanceData.DistanceToTarget = FVector::Distance(InstanceData.TargetPlayerLocation, InstanceData.Character->GetActorLocation()); + + return EStateTreeRunStatus::Running; +} + +#if WITH_EDITOR +FText FStateTreeGetPlayerInfoTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Get Player Info"); +} +#endif // WITH_EDITOR \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/AI/CombatStateTreeUtility.h b/Source/AgrarianGame/Variant_Combat/AI/CombatStateTreeUtility.h new file mode 100644 index 0000000..283c3e4 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/CombatStateTreeUtility.h @@ -0,0 +1,365 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "StateTreeTaskBase.h" +#include "StateTreeConditionBase.h" + +#include "CombatStateTreeUtility.generated.h" + +class ACharacter; +class AAIController; +class ACombatEnemy; + +/** + * Instance data struct for the FStateTreeCharacterGroundedCondition condition + */ +USTRUCT() +struct FStateTreeCharacterGroundedConditionInstanceData +{ + GENERATED_BODY() + + /** Character to check grounded status on */ + UPROPERTY(EditAnywhere, Category = "Context") + ACharacter* Character; + + /** If true, the condition passes if the character is not grounded instead */ + UPROPERTY(EditAnywhere, Category = "Condition") + bool bMustBeOnAir = false; +}; +STATETREE_POD_INSTANCEDATA(FStateTreeCharacterGroundedConditionInstanceData); + +/** + * StateTree condition to check if the character is grounded + */ +USTRUCT(DisplayName = "Character is Grounded") +struct FStateTreeCharacterGroundedCondition : public FStateTreeConditionCommonBase +{ + GENERATED_BODY() + + /** Set the instance data type */ + using FInstanceDataType = FStateTreeCharacterGroundedConditionInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Default constructor */ + FStateTreeCharacterGroundedCondition() = default; + + /** Tests the StateTree condition */ + virtual bool TestCondition(FStateTreeExecutionContext& Context) const override; + +#if WITH_EDITOR + + /** Provides the description string */ + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif + +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the FStateTreeIsInDangerCondition condition + */ +USTRUCT() +struct FStateTreeIsInDangerConditionInstanceData +{ + GENERATED_BODY() + + /** Character to check danger status on */ + UPROPERTY(EditAnywhere, Category = "Context") + ACombatEnemy* Character; + + /** Minimum time to wait before reacting to the danger event */ + UPROPERTY(EditAnywhere, Category = "Parameters", meta = (Units = "s")) + float MinReactionTime = 0.35f; + + /** Maximum time to wait before ignoring the danger event */ + UPROPERTY(EditAnywhere, Category = "Parameters", meta = (Units = "s")) + float MaxReactionTime = 0.75f; + + /** Line of sight half angle for detecting incoming danger, in degrees*/ + UPROPERTY(EditAnywhere, Category = "Parameters", meta = (Units = "degrees")) + float DangerSightConeAngle = 120.0f; +}; +STATETREE_POD_INSTANCEDATA(FStateTreeIsInDangerConditionInstanceData); + +/** + * StateTree condition to check if the character is about to be hit by an attack + */ +USTRUCT(DisplayName = "Character is in Danger") +struct FStateTreeIsInDangerCondition : public FStateTreeConditionCommonBase +{ + GENERATED_BODY() + + /** Set the instance data type */ + using FInstanceDataType = FStateTreeIsInDangerConditionInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Default constructor */ + FStateTreeIsInDangerCondition() = default; + + /** Tests the StateTree condition */ + virtual bool TestCondition(FStateTreeExecutionContext& Context) const override; + +#if WITH_EDITOR + + /** Provides the description string */ + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif + +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Combat StateTree tasks + */ +USTRUCT() +struct FStateTreeAttackInstanceData +{ + GENERATED_BODY() + + /** Character that will perform the attack */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Character; +}; + +/** + * StateTree task to perform a combo attack + */ +USTRUCT(meta=(DisplayName="Combo Attack", Category="Combat")) +struct FStateTreeComboAttackTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeAttackInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +/** + * StateTree task to perform a charged attack + */ +USTRUCT(meta=(DisplayName="Charged Attack", Category="Combat")) +struct FStateTreeChargedAttackTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeAttackInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +/** + * StateTree task to wait for the character to land + */ +USTRUCT(meta=(DisplayName="Wait for Landing", Category="Combat")) +struct FStateTreeWaitForLandingTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeAttackInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Face Towards Actor StateTree task + */ +USTRUCT() +struct FStateTreeFaceActorInstanceData +{ + GENERATED_BODY() + + /** AI Controller that will determine the focused actor */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Controller; + + /** Actor that will be faced towards */ + UPROPERTY(EditAnywhere, Category = Input) + TObjectPtr ActorToFaceTowards; +}; + +/** + * StateTree task to face an AI-Controlled Pawn towards an Actor + */ +USTRUCT(meta=(DisplayName="Face Towards Actor", Category="Combat")) +struct FStateTreeFaceActorTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeFaceActorInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Face Towards Location StateTree task + */ +USTRUCT() +struct FStateTreeFaceLocationInstanceData +{ + GENERATED_BODY() + + /** AI Controller that will determine the focused location */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Controller; + + /** Location that will be faced towards */ + UPROPERTY(EditAnywhere, Category = Parameter) + FVector FaceLocation = FVector::ZeroVector; +}; + +/** + * StateTree task to face an AI-Controlled Pawn towards a world location + */ +USTRUCT(meta=(DisplayName="Face Towards Location", Category="Combat")) +struct FStateTreeFaceLocationTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeFaceLocationInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Set Character Speed StateTree task + */ +USTRUCT() +struct FStateTreeSetCharacterSpeedInstanceData +{ + GENERATED_BODY() + + /** Character that will be affected */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Character; + + /** Max ground speed to set for the character */ + UPROPERTY(EditAnywhere, Category = Parameter) + float Speed = 600.0f; +}; + +/** + * StateTree task to change a Character's ground speed + */ +USTRUCT(meta=(DisplayName="Set Character Speed", Category="Combat")) +struct FStateTreeSetCharacterSpeedTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeSetCharacterSpeedInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Get Player Info task + */ +USTRUCT() +struct FStateTreeGetPlayerInfoInstanceData +{ + GENERATED_BODY() + + /** Character that owns this task */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Character; + + /** Character that owns this task */ + UPROPERTY(VisibleAnywhere) + TObjectPtr TargetPlayerCharacter; + + /** Last known location for the target */ + UPROPERTY(VisibleAnywhere) + FVector TargetPlayerLocation = FVector::ZeroVector; + + /** Distance to the target */ + UPROPERTY(VisibleAnywhere) + float DistanceToTarget = 0.0f; +}; + +/** + * StateTree task to get information about the player character + */ +USTRUCT(meta=(DisplayName="GetPlayerInfo", Category="Combat")) +struct FStateTreeGetPlayerInfoTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeGetPlayerInfoInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs while the owning state is active */ + virtual EStateTreeRunStatus Tick(FStateTreeExecutionContext& Context, const float DeltaTime) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Danger.cpp b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Danger.cpp new file mode 100644 index 0000000..f356711 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Danger.cpp @@ -0,0 +1,17 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Combat/AI/EnvQueryContext_Danger.h" +#include "Variant_Combat/AI/CombatEnemy.h" +#include "EnvironmentQuery/EnvQueryTypes.h" +#include "EnvironmentQuery/Items/EnvQueryItemType_Point.h" + +void UEnvQueryContext_Danger::ProvideContext(FEnvQueryInstance& QueryInstance, FEnvQueryContextData& ContextData) const +{ + // get the querying enemy + if (ACombatEnemy* QuerierActor = Cast(QueryInstance.Owner.Get())) + { + // add the last recorded danger location to the context + UEnvQueryItemType_Point::SetContextHelper(ContextData, QuerierActor->GetLastDangerLocation()); + } +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Danger.h b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Danger.h new file mode 100644 index 0000000..056a14b --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Danger.h @@ -0,0 +1,23 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "EnvironmentQuery/EnvQueryContext.h" +#include "EnvQueryContext_Danger.generated.h" + +/** + * UEnvQueryContext_Danger + * Returns the enemy character's last known danger location + */ +UCLASS() +class AGRARIANGAME_API UEnvQueryContext_Danger : public UEnvQueryContext +{ + GENERATED_BODY() + +public: + + /** Provides the context locations or actors for this EnvQuery */ + virtual void ProvideContext(FEnvQueryInstance& QueryInstance, FEnvQueryContextData& ContextData) const override; + +}; diff --git a/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Player.cpp b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Player.cpp new file mode 100644 index 0000000..46ca669 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Player.cpp @@ -0,0 +1,18 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "EnvQueryContext_Player.h" +#include "Kismet/GameplayStatics.h" +#include "EnvironmentQuery/EnvQueryTypes.h" +#include "EnvironmentQuery/Items/EnvQueryItemType_Actor.h" +#include "GameFramework/Pawn.h" + +void UEnvQueryContext_Player::ProvideContext(FEnvQueryInstance& QueryInstance, FEnvQueryContextData& ContextData) const +{ + // get the player pawn for the first local player + AActor* PlayerPawn = UGameplayStatics::GetPlayerPawn(QueryInstance.Owner.Get(), 0); + check(PlayerPawn); + + // add the actor data to the context + UEnvQueryItemType_Actor::SetContextHelper(ContextData, PlayerPawn); +} diff --git a/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Player.h b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Player.h new file mode 100644 index 0000000..dc43895 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/AI/EnvQueryContext_Player.h @@ -0,0 +1,22 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "EnvironmentQuery/EnvQueryContext.h" +#include "EnvQueryContext_Player.generated.h" + +/** + * UEnvQueryContext_Player + * Basic EnvQuery Context that returns the first local player + */ +UCLASS() +class UEnvQueryContext_Player : public UEnvQueryContext +{ + GENERATED_BODY() + +public: + + /** Provides the context locations or actors for this EnvQuery */ + virtual void ProvideContext(FEnvQueryInstance& QueryInstance, FEnvQueryContextData& ContextData) const override; +}; diff --git a/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckChargedAttack.cpp b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckChargedAttack.cpp new file mode 100644 index 0000000..dbc5f12 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckChargedAttack.cpp @@ -0,0 +1,21 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "AnimNotify_CheckChargedAttack.h" +#include "CombatAttacker.h" +#include "Components/SkeletalMeshComponent.h" + +void UAnimNotify_CheckChargedAttack::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) +{ + // cast the owner to the attacker interface + if (ICombatAttacker* AttackerInterface = Cast(MeshComp->GetOwner())) + { + // tell the actor to check for a charged attack loop + AttackerInterface->CheckChargedAttack(); + } +} + +FString UAnimNotify_CheckChargedAttack::GetNotifyName_Implementation() const +{ + return FString("Check Charged Attack"); +} diff --git a/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckChargedAttack.h b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckChargedAttack.h new file mode 100644 index 0000000..98b1722 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckChargedAttack.h @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimNotifies/AnimNotify.h" +#include "AnimNotify_CheckChargedAttack.generated.h" + +/** + * AnimNotify to perform a charged attack hold check. + */ +UCLASS() +class UAnimNotify_CheckChargedAttack : public UAnimNotify +{ + GENERATED_BODY() + +public: + + /** Perform the Anim Notify */ + virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override; + + /** Get the notify name */ + virtual FString GetNotifyName_Implementation() const override; +}; diff --git a/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckCombo.cpp b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckCombo.cpp new file mode 100644 index 0000000..117dbf7 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckCombo.cpp @@ -0,0 +1,21 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "AnimNotify_CheckCombo.h" +#include "CombatAttacker.h" +#include "Components/SkeletalMeshComponent.h" + +void UAnimNotify_CheckCombo::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) +{ + // cast the owner to the attacker interface + if (ICombatAttacker* AttackerInterface = Cast(MeshComp->GetOwner())) + { + // tell the actor to check for combo string + AttackerInterface->CheckCombo(); + } +} + +FString UAnimNotify_CheckCombo::GetNotifyName_Implementation() const +{ + return FString("Check Combo String"); +} diff --git a/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckCombo.h b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckCombo.h new file mode 100644 index 0000000..cce0f6c --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_CheckCombo.h @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimNotifies/AnimNotify.h" +#include "AnimNotify_CheckCombo.generated.h" + +/** + * AnimNotify to perform a combo string check. + */ +UCLASS() +class UAnimNotify_CheckCombo : public UAnimNotify +{ + GENERATED_BODY() + +public: + + /** Perform the Anim Notify */ + virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override; + + /** Get the notify name */ + virtual FString GetNotifyName_Implementation() const override; +}; diff --git a/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_DoAttackTrace.cpp b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_DoAttackTrace.cpp new file mode 100644 index 0000000..13bd38f --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_DoAttackTrace.cpp @@ -0,0 +1,20 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "AnimNotify_DoAttackTrace.h" +#include "CombatAttacker.h" +#include "Components/SkeletalMeshComponent.h" + +void UAnimNotify_DoAttackTrace::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) +{ + // cast the owner to the attacker interface + if (ICombatAttacker* AttackerInterface = Cast(MeshComp->GetOwner())) + { + AttackerInterface->DoAttackTrace(AttackBoneName); + } +} + +FString UAnimNotify_DoAttackTrace::GetNotifyName_Implementation() const +{ + return FString("Do Attack Trace"); +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_DoAttackTrace.h b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_DoAttackTrace.h new file mode 100644 index 0000000..e9d7a4d --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Animation/AnimNotify_DoAttackTrace.h @@ -0,0 +1,30 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimNotifies/AnimNotify.h" +#include "AnimNotify_DoAttackTrace.generated.h" + +/** + * AnimNotify to tell the actor to perform an attack trace check to look for targets to damage. + */ +UCLASS() +class UAnimNotify_DoAttackTrace : public UAnimNotify +{ + GENERATED_BODY() + +protected: + + /** Source bone for the attack trace */ + UPROPERTY(EditAnywhere, Category="Attack") + FName AttackBoneName; + +public: + + /** Perform the Anim Notify */ + virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override; + + /** Get the notify name */ + virtual FString GetNotifyName_Implementation() const override; +}; diff --git a/Source/AgrarianGame/Variant_Combat/CombatCharacter.cpp b/Source/AgrarianGame/Variant_Combat/CombatCharacter.cpp new file mode 100644 index 0000000..63ebcf9 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/CombatCharacter.cpp @@ -0,0 +1,547 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatCharacter.h" +#include "Components/CapsuleComponent.h" +#include "Components/WidgetComponent.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "GameFramework/SpringArmComponent.h" +#include "Components/SkeletalMeshComponent.h" +#include "Camera/CameraComponent.h" +#include "EnhancedInputSubsystems.h" +#include "EnhancedInputComponent.h" +#include "CombatLifeBar.h" +#include "Engine/DamageEvents.h" +#include "TimerManager.h" +#include "Engine/LocalPlayer.h" +#include "CombatPlayerController.h" + +ACombatCharacter::ACombatCharacter() +{ + PrimaryActorTick.bCanEverTick = true; + + // bind the attack montage ended delegate + OnAttackMontageEnded.BindUObject(this, &ACombatCharacter::AttackMontageEnded); + + // Set size for collision capsule + GetCapsuleComponent()->InitCapsuleSize(35.0f, 90.0f); + + // Configure character movement + GetCharacterMovement()->MaxWalkSpeed = 400.0f; + + // create the camera boom + CameraBoom = CreateDefaultSubobject(TEXT("CameraBoom")); + CameraBoom->SetupAttachment(RootComponent); + + CameraBoom->TargetArmLength = DefaultCameraDistance; + CameraBoom->bUsePawnControlRotation = true; + CameraBoom->bEnableCameraLag = true; + CameraBoom->bEnableCameraRotationLag = true; + + // create the orbiting camera + FollowCamera = CreateDefaultSubobject(TEXT("FollowCamera")); + FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); + FollowCamera->bUsePawnControlRotation = false; + + // create the life bar widget component + LifeBar = CreateDefaultSubobject(TEXT("LifeBar")); + LifeBar->SetupAttachment(RootComponent); + + // set the player tag + Tags.Add(FName("Player")); +} + +void ACombatCharacter::Move(const FInputActionValue& Value) +{ + // input is a Vector2D + FVector2D MovementVector = Value.Get(); + + // route the input + DoMove(MovementVector.X, MovementVector.Y); +} + +void ACombatCharacter::Look(const FInputActionValue& Value) +{ + FVector2D LookAxisVector = Value.Get(); + + // route the input + DoLook(LookAxisVector.X, LookAxisVector.Y); +} + +void ACombatCharacter::ComboAttackPressed() +{ + // route the input + DoComboAttackStart(); +} + +void ACombatCharacter::ChargedAttackPressed() +{ + // route the input + DoChargedAttackStart(); +} + +void ACombatCharacter::ChargedAttackReleased() +{ + // route the input + DoChargedAttackEnd(); +} + +void ACombatCharacter::ToggleCamera() +{ + // call the BP hook + BP_ToggleCamera(); +} + +void ACombatCharacter::DoMove(float Right, float Forward) +{ + if (GetController() != nullptr) + { + // find out which way is forward + const FRotator Rotation = GetController()->GetControlRotation(); + const FRotator YawRotation(0, Rotation.Yaw, 0); + + // get forward vector + const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); + + // get right vector + const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); + + // add movement + AddMovementInput(ForwardDirection, Forward); + AddMovementInput(RightDirection, Right); + } +} + +void ACombatCharacter::DoLook(float Yaw, float Pitch) +{ + if (GetController() != nullptr) + { + // add yaw and pitch input to controller + AddControllerYawInput(Yaw); + AddControllerPitchInput(Pitch); + } +} + +void ACombatCharacter::DoComboAttackStart() +{ + // are we already playing an attack animation? + if (bIsAttacking) + { + // cache the input time so we can check it later + CachedAttackInputTime = GetWorld()->GetTimeSeconds(); + + return; + } + + // perform a combo attack + ComboAttack(); +} + +void ACombatCharacter::DoComboAttackEnd() +{ + // stub +} + +void ACombatCharacter::DoChargedAttackStart() +{ + // raise the charging attack flag + bIsChargingAttack = true; + + if (bIsAttacking) + { + // cache the input time so we can check it later + CachedAttackInputTime = GetWorld()->GetTimeSeconds(); + + return; + } + + ChargedAttack(); +} + +void ACombatCharacter::DoChargedAttackEnd() +{ + // lower the charging attack flag + bIsChargingAttack = false; + + // if we've done the charge loop at least once, release the charged attack right away + if (bHasLoopedChargedAttack) + { + CheckChargedAttack(); + } +} + +void ACombatCharacter::ResetHP() +{ + // reset the current HP total + CurrentHP = MaxHP; + + // update the life bar + LifeBarWidget->SetLifePercentage(1.0f); +} + +void ACombatCharacter::ComboAttack() +{ + // raise the attacking flag + bIsAttacking = true; + + // reset the combo count + ComboCount = 0; + + // notify enemies they are about to be attacked + NotifyEnemiesOfIncomingAttack(); + + // play the attack montage + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + const float MontageLength = AnimInstance->Montage_Play(ComboAttackMontage, 1.0f, EMontagePlayReturnType::MontageLength, 0.0f, true); + + // subscribe to montage completed and interrupted events + if (MontageLength > 0.0f) + { + // set the end delegate for the montage + AnimInstance->Montage_SetEndDelegate(OnAttackMontageEnded, ComboAttackMontage); + } + } + +} + +void ACombatCharacter::ChargedAttack() +{ + // raise the attacking flag + bIsAttacking = true; + + // reset the charge loop flag + bHasLoopedChargedAttack = false; + + // notify enemies they are about to be attacked + NotifyEnemiesOfIncomingAttack(); + + // play the charged attack montage + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + const float MontageLength = AnimInstance->Montage_Play(ChargedAttackMontage, 1.0f, EMontagePlayReturnType::MontageLength, 0.0f, true); + + // subscribe to montage completed and interrupted events + if (MontageLength > 0.0f) + { + // set the end delegate for the montage + AnimInstance->Montage_SetEndDelegate(OnAttackMontageEnded, ChargedAttackMontage); + } + } +} + +void ACombatCharacter::AttackMontageEnded(UAnimMontage* Montage, bool bInterrupted) +{ + // reset the attacking flag + bIsAttacking = false; + + // check if we have a non-stale cached input + if (GetWorld()->GetTimeSeconds() - CachedAttackInputTime <= AttackInputCacheTimeTolerance) + { + // are we holding the charged attack button? + if (bIsChargingAttack) + { + // do a charged attack + ChargedAttack(); + } + else + { + // do a regular attack + ComboAttack(); + } + } +} + +void ACombatCharacter::DoAttackTrace(FName DamageSourceBone) +{ + // sweep for objects in front of the character to be hit by the attack + TArray OutHits; + + // start at the provided socket location, sweep forward + const FVector TraceStart = GetMesh()->GetSocketLocation(DamageSourceBone); + const FVector TraceEnd = TraceStart + (GetActorForwardVector() * MeleeTraceDistance); + + // check for pawn and world dynamic collision object types + FCollisionObjectQueryParams ObjectParams; + ObjectParams.AddObjectTypesToQuery(ECC_Pawn); + ObjectParams.AddObjectTypesToQuery(ECC_WorldDynamic); + + // use a sphere shape for the sweep + FCollisionShape CollisionShape; + CollisionShape.SetSphere(MeleeTraceRadius); + + // ignore self + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + if (GetWorld()->SweepMultiByObjectType(OutHits, TraceStart, TraceEnd, FQuat::Identity, ObjectParams, CollisionShape, QueryParams)) + { + // iterate over each object hit + for (const FHitResult& CurrentHit : OutHits) + { + // check if we've hit a damageable actor + ICombatDamageable* Damageable = Cast(CurrentHit.GetActor()); + + if (Damageable) + { + // knock upwards and away from the impact normal + const FVector Impulse = (CurrentHit.ImpactNormal * -MeleeKnockbackImpulse) + (FVector::UpVector * MeleeLaunchImpulse); + + // pass the damage event to the actor + Damageable->ApplyDamage(MeleeDamage, this, CurrentHit.ImpactPoint, Impulse); + + // call the BP handler to play effects, etc. + DealtDamage(MeleeDamage, CurrentHit.ImpactPoint); + } + } + } +} + +void ACombatCharacter::CheckCombo() +{ + // are we playing a non-charge attack animation? + if (bIsAttacking && !bIsChargingAttack) + { + // is the last attack input not stale? + if (GetWorld()->GetTimeSeconds() - CachedAttackInputTime <= ComboInputCacheTimeTolerance) + { + // consume the attack input so we don't accidentally trigger it twice + CachedAttackInputTime = 0.0f; + + // increase the combo counter + ++ComboCount; + + // do we still have a combo section to play? + if (ComboCount < ComboSectionNames.Num()) + { + // notify enemies they are about to be attacked + NotifyEnemiesOfIncomingAttack(); + + // jump to the next combo section + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + AnimInstance->Montage_JumpToSection(ComboSectionNames[ComboCount], ComboAttackMontage); + } + } + } + } +} + +void ACombatCharacter::CheckChargedAttack() +{ + // raise the looped charged attack flag + bHasLoopedChargedAttack = true; + + // jump to either the loop or the attack section depending on whether we're still holding the charge button + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + AnimInstance->Montage_JumpToSection(bIsChargingAttack ? ChargeLoopSection : ChargeAttackSection, ChargedAttackMontage); + } +} + +void ACombatCharacter::NotifyEnemiesOfIncomingAttack() +{ + // sweep for objects in front of the character to be hit by the attack + TArray OutHits; + + // start at the actor location, sweep forward + const FVector TraceStart = GetActorLocation(); + const FVector TraceEnd = TraceStart + (GetActorForwardVector() * DangerTraceDistance); + + // check for pawn object types only + FCollisionObjectQueryParams ObjectParams; + ObjectParams.AddObjectTypesToQuery(ECC_Pawn); + + // use a sphere shape for the sweep + FCollisionShape CollisionShape; + CollisionShape.SetSphere(DangerTraceRadius); + + // ignore self + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + if (GetWorld()->SweepMultiByObjectType(OutHits, TraceStart, TraceEnd, FQuat::Identity, ObjectParams, CollisionShape, QueryParams)) + { + // iterate over each object hit + for (const FHitResult& CurrentHit : OutHits) + { + // check if we've hit a damageable actor + ICombatDamageable* Damageable = Cast(CurrentHit.GetActor()); + + if (Damageable) + { + // notify the enemy + Damageable->NotifyDanger(GetActorLocation(), this); + } + } + } +} + +void ACombatCharacter::ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) +{ + // pass the damage event to the actor + FDamageEvent DamageEvent; + const float ActualDamage = TakeDamage(Damage, DamageEvent, nullptr, DamageCauser); + + // only process knockback and effects if we received nonzero damage + if (ActualDamage > 0.0f) + { + // apply the knockback impulse + GetCharacterMovement()->AddImpulse(DamageImpulse, true); + + // is the character ragdolling? + if (GetMesh()->IsSimulatingPhysics()) + { + // apply an impulse to the ragdoll + GetMesh()->AddImpulseAtLocation(DamageImpulse * GetMesh()->GetMass(), DamageLocation); + } + + // pass control to BP to play effects, etc. + ReceivedDamage(ActualDamage, DamageLocation, DamageImpulse.GetSafeNormal()); + } + +} + +void ACombatCharacter::HandleDeath() +{ + // disable movement while we're dead + GetCharacterMovement()->DisableMovement(); + + // enable full ragdoll physics + GetMesh()->SetSimulatePhysics(true); + + // hide the life bar + LifeBar->SetHiddenInGame(true); + + // pull back the camera + GetCameraBoom()->TargetArmLength = DeathCameraDistance; + + // schedule respawning + GetWorld()->GetTimerManager().SetTimer(RespawnTimer, this, &ACombatCharacter::RespawnCharacter, RespawnTime, false); +} + +void ACombatCharacter::ApplyHealing(float Healing, AActor* Healer) +{ + // stub +} + +void ACombatCharacter::NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) +{ + // stub +} + +void ACombatCharacter::RespawnCharacter() +{ + // destroy the character and let it be respawned by the Player Controller + Destroy(); +} + +float ACombatCharacter::TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) +{ + // only process damage if the character is still alive + if (CurrentHP <= 0.0f) + { + return 0.0f; + } + + // reduce the current HP + CurrentHP -= Damage; + + // have we run out of HP? + if (CurrentHP <= 0.0f) + { + // die + HandleDeath(); + } + else + { + // update the life bar + LifeBarWidget->SetLifePercentage(CurrentHP / MaxHP); + + // enable partial ragdoll physics, but keep the pelvis vertical + GetMesh()->SetPhysicsBlendWeight(0.5f); + GetMesh()->SetBodySimulatePhysics(PelvisBoneName, false); + } + + // return the received damage amount + return Damage; +} + +void ACombatCharacter::Landed(const FHitResult& Hit) +{ + Super::Landed(Hit); + + // is the character still alive? + if (CurrentHP >= 0.0f) + { + // disable ragdoll physics + GetMesh()->SetPhysicsBlendWeight(0.0f); + } +} + +void ACombatCharacter::BeginPlay() +{ + Super::BeginPlay(); + + // get the life bar from the widget component + LifeBarWidget = Cast(LifeBar->GetUserWidgetObject()); + check(LifeBarWidget); + + // initialize the camera + GetCameraBoom()->TargetArmLength = DefaultCameraDistance; + + // save the relative transform for the mesh so we can reset the ragdoll later + MeshStartingTransform = GetMesh()->GetRelativeTransform(); + + // set the life bar color + LifeBarWidget->SetBarColor(LifeBarColor); + + // reset HP to maximum + ResetHP(); +} + +void ACombatCharacter::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the respawn timer + GetWorld()->GetTimerManager().ClearTimer(RespawnTimer); +} + +void ACombatCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + Super::SetupPlayerInputComponent(PlayerInputComponent); + + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + // Moving + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ACombatCharacter::Move); + + // Looking + EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &ACombatCharacter::Look); + EnhancedInputComponent->BindAction(MouseLookAction, ETriggerEvent::Triggered, this, &ACombatCharacter::Look); + + // Combo Attack + EnhancedInputComponent->BindAction(ComboAttackAction, ETriggerEvent::Started, this, &ACombatCharacter::ComboAttackPressed); + + // Charged Attack + EnhancedInputComponent->BindAction(ChargedAttackAction, ETriggerEvent::Started, this, &ACombatCharacter::ChargedAttackPressed); + EnhancedInputComponent->BindAction(ChargedAttackAction, ETriggerEvent::Completed, this, &ACombatCharacter::ChargedAttackReleased); + + // Camera Side Toggle + EnhancedInputComponent->BindAction(ToggleCameraAction, ETriggerEvent::Triggered, this, &ACombatCharacter::ToggleCamera); + } +} + +void ACombatCharacter::NotifyControllerChanged() +{ + Super::NotifyControllerChanged(); + + // update the respawn transform on the Player Controller + if (ACombatPlayerController* PC = Cast(GetController())) + { + PC->SetRespawnTransform(GetActorTransform()); + } +} + diff --git a/Source/AgrarianGame/Variant_Combat/CombatCharacter.h b/Source/AgrarianGame/Variant_Combat/CombatCharacter.h new file mode 100644 index 0000000..85e8641 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/CombatCharacter.h @@ -0,0 +1,334 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "CombatAttacker.h" +#include "CombatDamageable.h" +#include "Animation/AnimInstance.h" +#include "CombatCharacter.generated.h" + +class USpringArmComponent; +class UCameraComponent; +class UInputAction; +struct FInputActionValue; +class UCombatLifeBar; +class UWidgetComponent; + +DECLARE_LOG_CATEGORY_EXTERN(LogCombatCharacter, Log, All); + +/** + * An enhanced Third Person Character with melee combat capabilities: + * - Combo attack string + * - Press and hold charged attack + * - Damage dealing and reaction + * - Death + * - Respawning + */ +UCLASS(abstract) +class ACombatCharacter : public ACharacter, public ICombatAttacker, public ICombatDamageable +{ + GENERATED_BODY() + + /** Camera boom positioning the camera behind the character */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USpringArmComponent* CameraBoom; + + /** Follow camera */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UCameraComponent* FollowCamera; + + /** Life bar widget component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UWidgetComponent* LifeBar; + +protected: + + /** Jump Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* JumpAction; + + /** Move Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* MoveAction; + + /** Look Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* LookAction; + + /** Mouse Look Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* MouseLookAction; + + /** Combo Attack Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* ComboAttackAction; + + /** Charged Attack Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* ChargedAttackAction; + + /** Toggle Camera Side Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* ToggleCameraAction; + + /** Max amount of HP the character will have on respawn */ + UPROPERTY(EditAnywhere, Category="Damage", meta = (ClampMin = 0, ClampMax = 100)) + float MaxHP = 5.0f; + + /** Current amount of HP the character has */ + UPROPERTY(VisibleAnywhere, Category="Damage") + float CurrentHP = 0.0f; + + /** Life bar widget fill color */ + UPROPERTY(EditAnywhere, Category="Damage") + FLinearColor LifeBarColor; + + /** Name of the pelvis bone, for damage ragdoll physics */ + UPROPERTY(EditAnywhere, Category="Damage") + FName PelvisBoneName; + + /** Pointer to the life bar widget */ + UPROPERTY(EditAnywhere, Category="Damage") + TObjectPtr LifeBarWidget; + + /** Max amount of time that may elapse for a non-combo attack input to not be considered stale */ + UPROPERTY(EditAnywhere, Category="Melee Attack", meta = (ClampMin = 0, ClampMax = 5, Units = "s")) + float AttackInputCacheTimeTolerance = 1.0f; + + /** Time at which an attack button was last pressed */ + float CachedAttackInputTime = 0.0f; + + /** If true, the character is currently playing an attack animation */ + bool bIsAttacking = false; + + /** Distance ahead of the character that melee attack sphere collision traces will extend */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Trace", meta = (ClampMin = 0, ClampMax = 500, Units="cm")) + float MeleeTraceDistance = 75.0f; + + /** Radius of the sphere trace for melee attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Trace", meta = (ClampMin = 0, ClampMax = 200, Units = "cm")) + float MeleeTraceRadius = 75.0f; + + /** Distance ahead of the character that enemies will be notified of incoming attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Trace", meta = (ClampMin = 0, ClampMax = 500, Units="cm")) + float DangerTraceDistance = 300.0f; + + /** Radius of the sphere trace to notify enemies of incoming attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Trace", meta = (ClampMin = 0, ClampMax = 200, Units = "cm")) + float DangerTraceRadius = 100.0f; + + /** Amount of damage a melee attack will deal */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Damage", meta = (ClampMin = 0, ClampMax = 100)) + float MeleeDamage = 1.0f; + + /** Amount of knockback impulse a melee attack will apply */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Damage", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm/s")) + float MeleeKnockbackImpulse = 250.0f; + + /** Amount of upwards impulse a melee attack will apply */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Damage", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm/s")) + float MeleeLaunchImpulse = 300.0f; + + /** AnimMontage that will play for combo attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Combo") + UAnimMontage* ComboAttackMontage; + + /** Names of the AnimMontage sections that correspond to each stage of the combo attack */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Combo") + TArray ComboSectionNames; + + /** Max amount of time that may elapse for a combo attack input to not be considered stale */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Combo", meta = (ClampMin = 0, ClampMax = 5, Units = "s")) + float ComboInputCacheTimeTolerance = 0.45f; + + /** Index of the current stage of the melee attack combo */ + int32 ComboCount = 0; + + /** AnimMontage that will play for charged attacks */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged") + UAnimMontage* ChargedAttackMontage; + + /** Name of the AnimMontage section that corresponds to the charge loop */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged") + FName ChargeLoopSection; + + /** Name of the AnimMontage section that corresponds to the attack */ + UPROPERTY(EditAnywhere, Category="Melee Attack|Charged") + FName ChargeAttackSection; + + /** Flag that determines if the player is currently holding the charged attack input */ + bool bIsChargingAttack = false; + + /** If true, the charged attack hold check has been tested at least once */ + bool bHasLoopedChargedAttack = false; + + /** Camera boom length while the character is dead */ + UPROPERTY(EditAnywhere, Category="Camera", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm")) + float DeathCameraDistance = 400.0f; + + /** Camera boom length when the character respawns */ + UPROPERTY(EditAnywhere, Category="Camera", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm")) + float DefaultCameraDistance = 100.0f; + + /** Time to wait before respawning the character */ + UPROPERTY(EditAnywhere, Category="Respawn", meta = (ClampMin = 0, ClampMax = 10, Units = "s")) + float RespawnTime = 3.0f; + + /** Attack montage ended delegate */ + FOnMontageEnded OnAttackMontageEnded; + + /** Character respawn timer */ + FTimerHandle RespawnTimer; + + /** Copy of the mesh's transform so we can reset it after ragdoll animations */ + FTransform MeshStartingTransform; + +public: + + /** Constructor */ + ACombatCharacter(); + +protected: + + /** Called for movement input */ + void Move(const FInputActionValue& Value); + + /** Called for looking input */ + void Look(const FInputActionValue& Value); + + /** Called for combo attack input */ + void ComboAttackPressed(); + + /** Called for combo attack input pressed */ + void ChargedAttackPressed(); + + /** Called for combo attack input released */ + void ChargedAttackReleased(); + + /** Called for toggle camera side input */ + void ToggleCamera(); + + /** BP hook to animate the camera side switch */ + UFUNCTION(BlueprintImplementableEvent, Category="Combat") + void BP_ToggleCamera(); + +public: + + /** Handles move inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoMove(float Right, float Forward); + + /** Handles look inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoLook(float Yaw, float Pitch); + + /** Handles combo attack pressed from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoComboAttackStart(); + + /** Handles combo attack released from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoComboAttackEnd(); + + /** Handles charged attack pressed from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoChargedAttackStart(); + + /** Handles charged attack released from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoChargedAttackEnd(); + +protected: + + /** Resets the character's current HP to maximum */ + void ResetHP(); + + /** Performs a combo attack */ + void ComboAttack(); + + /** Performs a charged attack */ + void ChargedAttack(); + + /** Called from a delegate when the attack montage ends */ + void AttackMontageEnded(UAnimMontage* Montage, bool bInterrupted); + + +public: + + // ~begin CombatAttacker interface + + /** Performs the collision check for an attack */ + virtual void DoAttackTrace(FName DamageSourceBone) override; + + /** Performs the combo string check */ + virtual void CheckCombo() override; + + /** Performs the charged attack hold check */ + virtual void CheckChargedAttack() override; + + // ~end CombatAttacker interface + + // ~begin CombatDamageable interface + + /** Notifies nearby enemies that an attack is coming so they can react */ + void NotifyEnemiesOfIncomingAttack(); + + /** Handles damage and knockback events */ + virtual void ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) override; + + /** Handles death events */ + virtual void HandleDeath() override; + + /** Handles healing events */ + virtual void ApplyHealing(float Healing, AActor* Healer) override; + + /** Allows reaction to incoming attacks */ + virtual void NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) override; + + // ~end CombatDamageable interface + + /** Called from the respawn timer to destroy and re-create the character */ + void RespawnCharacter(); + +public: + + /** Overrides the default TakeDamage functionality */ + virtual float TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override; + + /** Overrides landing to reset damage ragdoll physics */ + virtual void Landed(const FHitResult& Hit) override; + +protected: + + /** Blueprint handler to play damage dealt effects */ + UFUNCTION(BlueprintImplementableEvent, Category="Combat") + void DealtDamage(float Damage, const FVector& ImpactPoint); + + /** Blueprint handler to play damage received effects */ + UFUNCTION(BlueprintImplementableEvent, Category="Combat") + void ReceivedDamage(float Damage, const FVector& ImpactPoint, const FVector& DamageDirection); + +protected: + + /** Initialization */ + virtual void BeginPlay() override; + + /** Cleanup */ + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + /** Handles input bindings */ + virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + + /** Handles possessed initialization */ + virtual void NotifyControllerChanged() override; + +public: + + /** Returns CameraBoom subobject **/ + FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; } + + /** Returns FollowCamera subobject **/ + FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; } +}; diff --git a/Source/AgrarianGame/Variant_Combat/CombatGameMode.cpp b/Source/AgrarianGame/Variant_Combat/CombatGameMode.cpp new file mode 100644 index 0000000..68f052f --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/CombatGameMode.cpp @@ -0,0 +1,9 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Combat/CombatGameMode.h" + +ACombatGameMode::ACombatGameMode() +{ + +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/CombatGameMode.h b/Source/AgrarianGame/Variant_Combat/CombatGameMode.h new file mode 100644 index 0000000..e28d67b --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/CombatGameMode.h @@ -0,0 +1,20 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "CombatGameMode.generated.h" + +/** + * Simple GameMode for a third person combat game + */ +UCLASS(abstract) +class ACombatGameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + + ACombatGameMode(); +}; diff --git a/Source/AgrarianGame/Variant_Combat/CombatPlayerController.cpp b/Source/AgrarianGame/Variant_Combat/CombatPlayerController.cpp new file mode 100644 index 0000000..64197bf --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/CombatPlayerController.cpp @@ -0,0 +1,95 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Combat/CombatPlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "InputMappingContext.h" +#include "Kismet/GameplayStatics.h" +#include "GameFramework/PlayerStart.h" +#include "CombatCharacter.h" +#include "Engine/LocalPlayer.h" +#include "Engine/World.h" +#include "Blueprint/UserWidget.h" +#include "AgrarianGame.h" +#include "Widgets/Input/SVirtualJoystick.h" + +void ACombatPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // only spawn touch controls on local player controllers + if (ShouldUseTouchControls() && IsLocalPlayerController()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(LogAgrarianGame, Error, TEXT("Could not spawn mobile controls widget.")); + + } + + } +} + +void ACombatPlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // add the input mapping context + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!ShouldUseTouchControls()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } +} + +void ACombatPlayerController::OnPossess(APawn* InPawn) +{ + Super::OnPossess(InPawn); + + // subscribe to the pawn's OnDestroyed delegate + InPawn->OnDestroyed.AddDynamic(this, &ACombatPlayerController::OnPawnDestroyed); +} + +void ACombatPlayerController::SetRespawnTransform(const FTransform& NewRespawn) +{ + // save the new respawn transform + RespawnTransform = NewRespawn; +} + +void ACombatPlayerController::OnPawnDestroyed(AActor* DestroyedActor) +{ + // spawn a new character at the respawn transform + if (ACombatCharacter* RespawnedCharacter = GetWorld()->SpawnActor(CharacterClass, RespawnTransform)) + { + // possess the character + Possess(RespawnedCharacter); + } +} + +bool ACombatPlayerController::ShouldUseTouchControls() const +{ + // are we on a mobile platform? Should we force touch? + return SVirtualJoystick::ShouldDisplayTouchInterface() || bForceTouchControls; +} diff --git a/Source/AgrarianGame/Variant_Combat/CombatPlayerController.h b/Source/AgrarianGame/Variant_Combat/CombatPlayerController.h new file mode 100644 index 0000000..2e1ac16 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/CombatPlayerController.h @@ -0,0 +1,76 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "CombatPlayerController.generated.h" + +class UInputMappingContext; +class ACombatCharacter; + +/** + * Simple Player Controller for a third person combat game + * Manages input mappings + * Respawns the player character at the checkpoint when it's destroyed + */ +UCLASS(abstract, Config="Game") +class ACombatPlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Input mapping context for this player */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + UPROPERTY() + TObjectPtr MobileControlsWidget; + + /** If true, the player will use UMG touch controls even if not playing on mobile platforms */ + UPROPERTY(EditAnywhere, Config, Category = "Input|Touch Controls") + bool bForceTouchControls = false; + + /** Character class to respawn when the possessed pawn is destroyed */ + UPROPERTY(EditAnywhere, Category="Respawn") + TSubclassOf CharacterClass; + + /** Transform to respawn the character at. Can be set to create checkpoints */ + FTransform RespawnTransform; + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Initialize input bindings */ + virtual void SetupInputComponent() override; + + /** Pawn initialization */ + virtual void OnPossess(APawn* InPawn) override; + +public: + + /** Updates the character respawn transform */ + void SetRespawnTransform(const FTransform& NewRespawn); + +protected: + + /** Called if the possessed pawn is destroyed */ + UFUNCTION() + void OnPawnDestroyed(AActor* DestroyedActor); + + /** Returns true if the player should use UMG touch controls */ + bool ShouldUseTouchControls() const; + +}; diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatActivationVolume.cpp b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatActivationVolume.cpp new file mode 100644 index 0000000..2d8d762 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatActivationVolume.cpp @@ -0,0 +1,49 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatActivationVolume.h" +#include "Components/BoxComponent.h" +#include "GameFramework/Character.h" +#include "CombatActivatable.h" + +ACombatActivationVolume::ACombatActivationVolume() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the box volume + RootComponent = Box = CreateDefaultSubobject(TEXT("Box")); + check(Box); + + // set the box's extent + Box->SetBoxExtent(FVector(500.0f, 500.0f, 500.0f)); + + // set the default collision profile to overlap all dynamic + Box->SetCollisionProfileName(FName("OverlapAllDynamic")); + + // bind the begin overlap + Box->OnComponentBeginOverlap.AddDynamic(this, &ACombatActivationVolume::OnOverlap); +} + +void ACombatActivationVolume::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + // has a Character entered the volume? + ACharacter* PlayerCharacter = Cast(OtherActor); + + if (PlayerCharacter) + { + // is the Character controlled by a player + if (PlayerCharacter->IsPlayerControlled()) + { + // process the actors to activate list + for (AActor* CurrentActor : ActorsToActivate) + { + // is the referenced actor activatable? + if(ICombatActivatable* Activatable = Cast(CurrentActor)) + { + Activatable->ActivateInteraction(PlayerCharacter); + } + } + } + } + +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatActivationVolume.h b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatActivationVolume.h new file mode 100644 index 0000000..9d63ede --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatActivationVolume.h @@ -0,0 +1,40 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "CombatActivationVolume.generated.h" + +class UBoxComponent; + +/** + * A simple volume that activates a list of actors when the player pawn enters. + */ +UCLASS() +class ACombatActivationVolume : public AActor +{ + GENERATED_BODY() + + /** Collision box volume */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category ="Components", meta = (AllowPrivateAccess = "true")) + UBoxComponent* Box; + +protected: + + /** List of actors to activate when this volume is entered */ + UPROPERTY(EditAnywhere, Category="Activation Volume") + TArray ActorsToActivate; + +public: + + /** Constructor */ + ACombatActivationVolume(); + +protected: + + /** Handles overlaps with the box volume */ + UFUNCTION() + void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + +}; diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatCheckpointVolume.cpp b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatCheckpointVolume.cpp new file mode 100644 index 0000000..78df43d --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatCheckpointVolume.cpp @@ -0,0 +1,47 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatCheckpointVolume.h" +#include "CombatCharacter.h" +#include "CombatPlayerController.h" + +ACombatCheckpointVolume::ACombatCheckpointVolume() +{ + // create the box volume + RootComponent = Box = CreateDefaultSubobject(TEXT("Box")); + check(Box); + + // set the box's extent + Box->SetBoxExtent(FVector(500.0f, 500.0f, 500.0f)); + + // set the default collision profile to overlap all dynamic + Box->SetCollisionProfileName(FName("OverlapAllDynamic")); + + // bind the begin overlap + Box->OnComponentBeginOverlap.AddDynamic(this, &ACombatCheckpointVolume::OnOverlap); +} + +void ACombatCheckpointVolume::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + // ensure we use this only once + if (bCheckpointUsed) + { + return; + } + + // has the player entered this volume? + ACombatCharacter* PlayerCharacter = Cast(OtherActor); + + if (PlayerCharacter) + { + if (ACombatPlayerController* PC = Cast(PlayerCharacter->GetController())) + { + // raise the checkpoint used flag + bCheckpointUsed = true; + + // update the player's respawn checkpoint + PC->SetRespawnTransform(PlayerCharacter->GetActorTransform()); + } + + } +} diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatCheckpointVolume.h b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatCheckpointVolume.h new file mode 100644 index 0000000..d3f326b --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatCheckpointVolume.h @@ -0,0 +1,32 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "Components/BoxComponent.h" +#include "CombatCheckpointVolume.generated.h" + +UCLASS(abstract) +class ACombatCheckpointVolume : public AActor +{ + GENERATED_BODY() + + /** Collision box volume */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Components, meta = (AllowPrivateAccess = "true")) + UBoxComponent* Box; + +public: + + /** Constructor */ + ACombatCheckpointVolume(); + +protected: + + /** Set to true after use to avoid accidentally resetting the checkpoint */ + bool bCheckpointUsed = false; + + /** Handles overlaps with the box volume */ + UFUNCTION() + void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); +}; diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDamageableBox.cpp b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDamageableBox.cpp new file mode 100644 index 0000000..2448ea7 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDamageableBox.cpp @@ -0,0 +1,83 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatDamageableBox.h" +#include "Components/StaticMeshComponent.h" +#include "TimerManager.h" +#include "Engine/World.h" + +ACombatDamageableBox::ACombatDamageableBox() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the mesh + RootComponent = Mesh = CreateDefaultSubobject(TEXT("Mesh")); + + // set the collision properties + Mesh->SetCollisionProfileName(FName("BlockAllDynamic")); + + // enable physics + Mesh->SetSimulatePhysics(true); + + // disable navigation relevance so boxes don't affect NavMesh generation + Mesh->bNavigationRelevant = false; +} + +void ACombatDamageableBox::RemoveFromLevel() +{ + // destroy this actor + Destroy(); +} + +void ACombatDamageableBox::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the death timer + GetWorld()->GetTimerManager().ClearTimer(DeathTimer); +} + +void ACombatDamageableBox::ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) +{ + // only process damage if we still have HP + if (CurrentHP > 0.0f) + { + // apply the damage + CurrentHP -= Damage; + + // are we dead? + if (CurrentHP <= 0.0f) + { + HandleDeath(); + } + + // apply a physics impulse to the box, ignoring its mass + Mesh->AddImpulseAtLocation(DamageImpulse * Mesh->GetMass(), DamageLocation); + + // call the BP handler to play effects, etc. + OnBoxDamaged(DamageLocation, DamageImpulse); + } +} + +void ACombatDamageableBox::HandleDeath() +{ + // change the collision object type to Visibility so we ignore most interactions but still retain physics collisions + Mesh->SetCollisionObjectType(ECC_Visibility); + + // call the BP handler to play effects, etc. + OnBoxDestroyed(); + + // set up the death cleanup timer + GetWorld()->GetTimerManager().SetTimer(DeathTimer, this, &ACombatDamageableBox::RemoveFromLevel, DeathDelayTime); +} + +void ACombatDamageableBox::ApplyHealing(float Healing, AActor* Healer) +{ + // stub +} + +void ACombatDamageableBox::NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) +{ + // stub +} + diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDamageableBox.h b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDamageableBox.h new file mode 100644 index 0000000..d0cb5c0 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDamageableBox.h @@ -0,0 +1,71 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "CombatDamageable.h" +#include "CombatDamageableBox.generated.h" + +/** + * A simple physics box that reacts to damage through the ICombatDamageable interface + */ +UCLASS(abstract) +class ACombatDamageableBox : public AActor, public ICombatDamageable +{ + GENERATED_BODY() + + /** Damageable box mesh */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* Mesh; + +public: + + /** Constructor */ + ACombatDamageableBox(); + +protected: + + /** Amount of HP this box starts with. */ + UPROPERTY(EditAnywhere, Category="Damage") + float CurrentHP = 3.0f; + + /** Time to wait before we remove this box from the level. */ + UPROPERTY(EditAnywhere, Category="Damage", meta = (ClampMin = 0, ClampMax = 10, Units = "s")) + float DeathDelayTime = 6.0f; + + /** Timer to defer destruction of this box after its HP are depleted */ + FTimerHandle DeathTimer; + + /** Blueprint damage handler for effect playback */ + UFUNCTION(BlueprintImplementableEvent, Category="Damage") + void OnBoxDamaged(const FVector& DamageLocation, const FVector& DamageImpulse); + + /** Blueprint destruction handler for effect playback */ + UFUNCTION(BlueprintImplementableEvent, Category="Damage") + void OnBoxDestroyed(); + + /** Timer callback to remove the box from the level after it dies */ + void RemoveFromLevel(); + +public: + + /** EndPlay cleanup */ + void EndPlay(EEndPlayReason::Type EndPlayReason) override; + + // ~Begin CombatDamageable interface + + /** Handles damage and knockback events */ + virtual void ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) override; + + /** Handles death events */ + virtual void HandleDeath() override; + + /** Handles healing events */ + virtual void ApplyHealing(float Healing, AActor* Healer) override; + + /** Allows reaction to incoming attacks */ + virtual void NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) override; + + // ~End CombatDamageable interface +}; diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDummy.cpp b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDummy.cpp new file mode 100644 index 0000000..6a38a3f --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDummy.cpp @@ -0,0 +1,56 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatDummy.h" +#include "Components/SceneComponent.h" +#include "Components/StaticMeshComponent.h" +#include "PhysicsEngine/PhysicsConstraintComponent.h" + +ACombatDummy::ACombatDummy() +{ + PrimaryActorTick.bCanEverTick = true; + + // create the root + Root = CreateDefaultSubobject(TEXT("Root")); + SetRootComponent(Root); + + // create the base plate + BasePlate = CreateDefaultSubobject(TEXT("Base Plate")); + BasePlate->SetupAttachment(RootComponent); + + // create the dummy + Dummy = CreateDefaultSubobject(TEXT("Dummy")); + Dummy->SetupAttachment(RootComponent); + + Dummy->SetSimulatePhysics(true); + + // create the physics constraint + PhysicsConstraint = CreateDefaultSubobject(TEXT("Physics Constraint")); + PhysicsConstraint->SetupAttachment(RootComponent); + + PhysicsConstraint->SetConstrainedComponents(BasePlate, NAME_None, Dummy, NAME_None); +} + +void ACombatDummy::ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) +{ + // apply impulse to the dummy + Dummy->AddImpulseAtLocation(DamageImpulse, DamageLocation); + + // call the BP handler + BP_OnDummyDamaged(DamageLocation, DamageImpulse.GetSafeNormal()); +} + +void ACombatDummy::HandleDeath() +{ + // unused +} + +void ACombatDummy::ApplyHealing(float Healing, AActor* Healer) +{ + // unused +} + +void ACombatDummy::NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) +{ + // unused +} diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDummy.h b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDummy.h new file mode 100644 index 0000000..5359506 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatDummy.h @@ -0,0 +1,63 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "CombatDamageable.h" +#include "CombatDummy.generated.h" + +class UStaticMeshComponent; +class UPhysicsConstraintComponent; + +/** + * A simple invincible combat training dummy + */ +UCLASS(abstract) +class ACombatDummy : public AActor, public ICombatDamageable +{ + GENERATED_BODY() + + /** Root component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + USceneComponent* Root; + + /** Static base plate */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* BasePlate; + + /** Physics enabled dummy mesh */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* Dummy; + + /** Physics constraint holding the dummy and base plate together */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true")) + UPhysicsConstraintComponent* PhysicsConstraint; + +public: + + /** Constructor */ + ACombatDummy(); + + // ~Begin CombatDamageable interface + + /** Handles damage and knockback events */ + virtual void ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) override; + + /** Handles death events */ + virtual void HandleDeath() override; + + /** Handles healing events */ + virtual void ApplyHealing(float Healing, AActor* Healer) override; + + /** Allows reaction to incoming attacks */ + virtual void NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) override; + + // ~End CombatDamageable interface + +protected: + + /** Blueprint handle to apply damage effects */ + UFUNCTION(BlueprintImplementableEvent, Category="Combat", meta = (DisplayName = "On Dummy Damaged")) + void BP_OnDummyDamaged(const FVector& Location, const FVector& Direction); +}; diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatLavaFloor.cpp b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatLavaFloor.cpp new file mode 100644 index 0000000..816663b --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatLavaFloor.cpp @@ -0,0 +1,27 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatLavaFloor.h" +#include "CombatDamageable.h" +#include "Components/StaticMeshComponent.h" + +ACombatLavaFloor::ACombatLavaFloor() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the mesh + RootComponent = Mesh = CreateDefaultSubobject(TEXT("Mesh")); + + // bind the hit handler + Mesh->OnComponentHit.AddDynamic(this, &ACombatLavaFloor::OnFloorHit); +} + +void ACombatLavaFloor::OnFloorHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) +{ + // check if the hit actor is damageable by casting to the interface + if (ICombatDamageable* Damageable = Cast(OtherActor)) + { + // damage the actor + Damageable->ApplyDamage(Damage, this, Hit.ImpactPoint, FVector::ZeroVector); + } +} diff --git a/Source/AgrarianGame/Variant_Combat/Gameplay/CombatLavaFloor.h b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatLavaFloor.h new file mode 100644 index 0000000..813e33a --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Gameplay/CombatLavaFloor.h @@ -0,0 +1,40 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "CombatLavaFloor.generated.h" + +class UStaticMeshComponent; +class UPrimitiveComponent; + +/** + * A basic actor that applies damage on contact through the ICombatDamageable interface. + */ +UCLASS(abstract) +class ACombatLavaFloor : public AActor +{ + GENERATED_BODY() + + /** Floor mesh */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* Mesh; + +protected: + + /** Amount of damage to deal on contact */ + UPROPERTY(EditAnywhere, Category="Damage") + float Damage = 10000.0f; + +public: + + /** Constructor */ + ACombatLavaFloor(); + +protected: + + /** Blocking hit handler */ + UFUNCTION() + void OnFloorHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); +}; diff --git a/Source/AgrarianGame/Variant_Combat/Interfaces/CombatActivatable.cpp b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatActivatable.cpp new file mode 100644 index 0000000..5a9f567 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatActivatable.cpp @@ -0,0 +1,4 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatActivatable.h" \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Combat/Interfaces/CombatActivatable.h b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatActivatable.h new file mode 100644 index 0000000..b7dafd4 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatActivatable.h @@ -0,0 +1,36 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "CombatActivatable.generated.h" + +/** + * Interactable Interface + * Provides a context-agnostic way of activating, deactivating or toggling actors + */ +UINTERFACE(MinimalAPI, NotBlueprintable) +class UCombatActivatable : public UInterface +{ + GENERATED_BODY() +}; + +class ICombatActivatable +{ + GENERATED_BODY() + +public: + + /** Toggles the Interactable Actor */ + UFUNCTION(BlueprintCallable, Category="Activatable") + virtual void ToggleInteraction(AActor* ActivationInstigator) = 0; + + /** Activates the Interactable Actor */ + UFUNCTION(BlueprintCallable, Category="Activatable") + virtual void ActivateInteraction(AActor* ActivationInstigator) = 0; + + /** Deactivates the Interactable Actor */ + UFUNCTION(BlueprintCallable, Category="Activatable") + virtual void DeactivateInteraction(AActor* ActivationInstigator) = 0; +}; diff --git a/Source/AgrarianGame/Variant_Combat/Interfaces/CombatAttacker.cpp b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatAttacker.cpp new file mode 100644 index 0000000..2abd0a2 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatAttacker.cpp @@ -0,0 +1,4 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatAttacker.h" diff --git a/Source/AgrarianGame/Variant_Combat/Interfaces/CombatAttacker.h b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatAttacker.h new file mode 100644 index 0000000..503a081 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatAttacker.h @@ -0,0 +1,36 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "CombatAttacker.generated.h" + +/** + * CombatAttacker Interface + * Provides common functionality to trigger attack animation events. + */ +UINTERFACE(MinimalAPI, NotBlueprintable) +class UCombatAttacker : public UInterface +{ + GENERATED_BODY() +}; + +class ICombatAttacker +{ + GENERATED_BODY() + +public: + + /** Performs an attack's collision check. Usually called from a montage's AnimNotify */ + UFUNCTION(BlueprintCallable, Category="Attacker") + virtual void DoAttackTrace(FName DamageSourceBone) = 0; + + /** Performs a combo attack's check to continue the string. Usually called from a montage's AnimNotify */ + UFUNCTION(BlueprintCallable, Category="Attacker") + virtual void CheckCombo() = 0; + + /** Performs a charged attack's check to loop the charge animation. Usually called from a montage's AnimNotify */ + UFUNCTION(BlueprintCallable, Category="Attacker") + virtual void CheckChargedAttack() = 0; +}; diff --git a/Source/AgrarianGame/Variant_Combat/Interfaces/CombatDamageable.cpp b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatDamageable.cpp new file mode 100644 index 0000000..5c82792 --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatDamageable.cpp @@ -0,0 +1,6 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatDamageable.h" + +// Add default functionality here for any ICombatDamageable functions that are not pure virtual. diff --git a/Source/AgrarianGame/Variant_Combat/Interfaces/CombatDamageable.h b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatDamageable.h new file mode 100644 index 0000000..8f2a09c --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/Interfaces/CombatDamageable.h @@ -0,0 +1,41 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "CombatDamageable.generated.h" + +/** + * CombatDamageable interface + * Provides functionality to handle damage, healing, knockback and death + * Also provides functionality to warn characters of incoming sources of damage + */ +UINTERFACE(MinimalAPI, NotBlueprintable) +class UCombatDamageable : public UInterface +{ + GENERATED_BODY() +}; + +class ICombatDamageable +{ + GENERATED_BODY() + +public: + + /** Handles damage and knockback events */ + UFUNCTION(BlueprintCallable, Category="Damageable") + virtual void ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse) = 0; + + /** Handles death events */ + UFUNCTION(BlueprintCallable, Category="Damageable") + virtual void HandleDeath() = 0; + + /** Handles healing events */ + UFUNCTION(BlueprintCallable, Category="Damageable") + virtual void ApplyHealing(float Healing, AActor* Healer) = 0; + + /** Notifies the actor of impending danger such as an incoming hit, allowing it to react. */ + UFUNCTION(BlueprintCallable, Category="Damageable") + virtual void NotifyDanger(const FVector& DangerLocation, AActor* DangerSource) = 0; +}; diff --git a/Source/AgrarianGame/Variant_Combat/UI/CombatLifeBar.cpp b/Source/AgrarianGame/Variant_Combat/UI/CombatLifeBar.cpp new file mode 100644 index 0000000..ed9c23e --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/UI/CombatLifeBar.cpp @@ -0,0 +1,5 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "CombatLifeBar.h" + diff --git a/Source/AgrarianGame/Variant_Combat/UI/CombatLifeBar.h b/Source/AgrarianGame/Variant_Combat/UI/CombatLifeBar.h new file mode 100644 index 0000000..9a2fcbe --- /dev/null +++ b/Source/AgrarianGame/Variant_Combat/UI/CombatLifeBar.h @@ -0,0 +1,26 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "CombatLifeBar.generated.h" + +/** + * A basic life bar user widget. + */ +UCLASS(abstract) +class UCombatLifeBar : public UUserWidget +{ + GENERATED_BODY() + +public: + + /** Sets the life bar to the provided 0-1 percentage value*/ + UFUNCTION(BlueprintImplementableEvent, Category="Life Bar") + void SetLifePercentage(float Percent); + + // Sets the life bar fill color + UFUNCTION(BlueprintImplementableEvent, Category="Life Bar") + void SetBarColor(FLinearColor Color); +}; diff --git a/Source/AgrarianGame/Variant_Platforming/Animation/AnimNotify_EndDash.cpp b/Source/AgrarianGame/Variant_Platforming/Animation/AnimNotify_EndDash.cpp new file mode 100644 index 0000000..cdf4041 --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/Animation/AnimNotify_EndDash.cpp @@ -0,0 +1,21 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "AnimNotify_EndDash.h" +#include "PlatformingCharacter.h" +#include "Components/SkeletalMeshComponent.h" + +void UAnimNotify_EndDash::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) +{ + // cast the owner to the attacker interface + if (APlatformingCharacter* PlatformingCharacter = Cast(MeshComp->GetOwner())) + { + // tell the actor to end the dash + PlatformingCharacter->EndDash(); + } +} + +FString UAnimNotify_EndDash::GetNotifyName_Implementation() const +{ + return FString("End Dash"); +} diff --git a/Source/AgrarianGame/Variant_Platforming/Animation/AnimNotify_EndDash.h b/Source/AgrarianGame/Variant_Platforming/Animation/AnimNotify_EndDash.h new file mode 100644 index 0000000..596620f --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/Animation/AnimNotify_EndDash.h @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimNotifies/AnimNotify.h" +#include "AnimNotify_EndDash.generated.h" + +/** + * AnimNotify to finish the dash animation and restore player control + */ +UCLASS() +class UAnimNotify_EndDash : public UAnimNotify +{ + GENERATED_BODY() + +public: + + /** Perform the Anim Notify */ + virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override; + + /** Get the notify name */ + virtual FString GetNotifyName_Implementation() const override; +}; diff --git a/Source/AgrarianGame/Variant_Platforming/PlatformingCharacter.cpp b/Source/AgrarianGame/Variant_Platforming/PlatformingCharacter.cpp new file mode 100644 index 0000000..38939f2 --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/PlatformingCharacter.cpp @@ -0,0 +1,367 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "PlatformingCharacter.h" + +#include "Components/CapsuleComponent.h" +#include "Engine/World.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "GameFramework/SpringArmComponent.h" +#include "Components/SkeletalMeshComponent.h" +#include "Camera/CameraComponent.h" +#include "EnhancedInputSubsystems.h" +#include "EnhancedInputComponent.h" +#include "TimerManager.h" +#include "Engine/LocalPlayer.h" + +APlatformingCharacter::APlatformingCharacter() +{ + PrimaryActorTick.bCanEverTick = true; + + // initialize the flags + bHasWallJumped = false; + bHasDoubleJumped = false; + bHasDashed = false; + bIsDashing = false; + + // bind the dash montage ended delegate + OnDashMontageEnded.BindUObject(this, &APlatformingCharacter::DashMontageEnded); + + // enable press and hold jump + JumpMaxHoldTime = 0.4f; + + // set the jump max count to 3 so we can double jump and check for coyote time jumps + JumpMaxCount = 3; + + // Set size for collision capsule + GetCapsuleComponent()->InitCapsuleSize(35.0f, 90.0f); + + // don't rotate the mesh when the controller rotates + bUseControllerRotationYaw = false; + + // Configure character movement + GetCharacterMovement()->GravityScale = 2.5f; + GetCharacterMovement()->MaxAcceleration = 1500.0f; + GetCharacterMovement()->BrakingFrictionFactor = 1.0f; + GetCharacterMovement()->bUseSeparateBrakingFriction = true; + + GetCharacterMovement()->GroundFriction = 4.0f; + GetCharacterMovement()->MaxWalkSpeed = 750.0f; + GetCharacterMovement()->MinAnalogWalkSpeed = 20.0f; + GetCharacterMovement()->BrakingDecelerationWalking = 2500.0f; + GetCharacterMovement()->PerchRadiusThreshold = 15.0f; + + GetCharacterMovement()->JumpZVelocity = 350.0f; + GetCharacterMovement()->BrakingDecelerationFalling = 750.0f; + GetCharacterMovement()->AirControl = 1.0f; + + GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); + GetCharacterMovement()->bOrientRotationToMovement = true; + + GetCharacterMovement()->NavAgentProps.AgentRadius = 42.0; + GetCharacterMovement()->NavAgentProps.AgentHeight = 192.0; + + // create the camera boom + CameraBoom = CreateDefaultSubobject(TEXT("CameraBoom")); + CameraBoom->SetupAttachment(RootComponent); + + CameraBoom->TargetArmLength = 400.0f; + CameraBoom->bUsePawnControlRotation = true; + CameraBoom->bEnableCameraLag = true; + CameraBoom->CameraLagSpeed = 8.0f; + CameraBoom->bEnableCameraRotationLag = true; + CameraBoom->CameraRotationLagSpeed = 8.0f; + + // create the orbiting camera + FollowCamera = CreateDefaultSubobject(TEXT("FollowCamera")); + FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); + FollowCamera->bUsePawnControlRotation = false; +} + +void APlatformingCharacter::Move(const FInputActionValue& Value) +{ + FVector2D MovementVector = Value.Get(); + + // route the input + DoMove(MovementVector.X, MovementVector.Y); +} + +void APlatformingCharacter::Look(const FInputActionValue& Value) +{ + FVector2D LookAxisVector = Value.Get(); + + // route the input + DoLook(LookAxisVector.X, LookAxisVector.Y); +} + + +void APlatformingCharacter::Dash() +{ + // route the input + DoDash(); +} + +void APlatformingCharacter::MultiJump() +{ + // ignore jumps while dashing + if(bIsDashing) + return; + + // are we already in the air? + if (GetCharacterMovement()->IsFalling()) + { + + // have we already wall jumped? + if (!bHasWallJumped) + { + // run a sphere sweep to check if we're in front of a wall + FHitResult OutHit; + + const FVector TraceStart = GetActorLocation(); + const FVector TraceEnd = TraceStart + (GetActorForwardVector() * WallJumpTraceDistance); + const FCollisionShape TraceShape = FCollisionShape::MakeSphere(WallJumpTraceRadius); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + if (GetWorld()->SweepSingleByChannel(OutHit, TraceStart, TraceEnd, FQuat(), ECollisionChannel::ECC_Visibility, TraceShape, QueryParams)) + { + // rotate the character to face away from the wall, so we're correctly oriented for the next wall jump + FRotator WallOrientation = OutHit.ImpactNormal.ToOrientationRotator(); + WallOrientation.Pitch = 0.0f; + WallOrientation.Roll = 0.0f; + + SetActorRotation(WallOrientation); + + // apply a launch impulse to the character to perform the actual wall jump + const FVector WallJumpImpulse = (OutHit.ImpactNormal * WallJumpBounceImpulse) + (FVector::UpVector * WallJumpVerticalImpulse); + + LaunchCharacter(WallJumpImpulse, true, true); + + // enable the jump trail + SetJumpTrailState(true); + + // raise the wall jump flag to prevent an immediate second wall jump + bHasWallJumped = true; + + GetWorld()->GetTimerManager().SetTimer(WallJumpTimer, this, &APlatformingCharacter::ResetWallJump, DelayBetweenWallJumps, false); + } + // no wall jump, try a double jump next + else + { + // are we still within coyote time frames? + if (GetWorld()->GetTimeSeconds() - LastFallTime < MaxCoyoteTime) + { + UE_LOG(LogTemp, Warning, TEXT("Coyote Jump")); + + // use the built-in CMC functionality to do the jump + Jump(); + + // enable the jump trail + SetJumpTrailState(true); + + // no coyote time jump + } else { + + // only double jump once while we're in the air + if (!bHasDoubleJumped) + { + bHasDoubleJumped = true; + + // use the built-in CMC functionality to do the double jump + Jump(); + + // enable the jump trail + SetJumpTrailState(true); + } + + } + + + } + } + + } + else + { + // we're grounded so just do a regular jump + Jump(); + + // activate the jump trail + SetJumpTrailState(true); + } +} + +void APlatformingCharacter::ResetWallJump() +{ + // reset the wall jump input lock + bHasWallJumped = false; +} + +void APlatformingCharacter::DoMove(float Right, float Forward) +{ + if (GetController() != nullptr) + { + // momentarily disable movement inputs if we've just wall jumped + if (!bHasWallJumped) + { + // find out which way is forward + const FRotator Rotation = GetController()->GetControlRotation(); + const FRotator YawRotation(0, Rotation.Yaw, 0); + + // get forward vector + const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); + + // get right vector + const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); + + // add movement + AddMovementInput(ForwardDirection, Forward); + AddMovementInput(RightDirection, Right); + } + } +} + +void APlatformingCharacter::DoLook(float Yaw, float Pitch) +{ + if (GetController() != nullptr) + { + // add yaw and pitch input to controller + AddControllerYawInput(Yaw); + AddControllerPitchInput(Pitch); + } +} + +void APlatformingCharacter::DoDash() +{ + // ignore the input if we've already dashed and have yet to reset + if (bHasDashed) + return; + + // raise the dash flags + bIsDashing = true; + bHasDashed = true; + + // disable gravity while dashing + GetCharacterMovement()->GravityScale = 0.0f; + + // reset the character velocity so we don't carry momentum into the dash + GetCharacterMovement()->Velocity = FVector::ZeroVector; + + // enable the jump trails + SetJumpTrailState(true); + + // play the dash montage + if (UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance()) + { + const float MontageLength = AnimInstance->Montage_Play(DashMontage, 1.0f, EMontagePlayReturnType::MontageLength, 0.0f, true); + + // has the montage played successfully? + if (MontageLength > 0.0f) + { + AnimInstance->Montage_SetEndDelegate(OnDashMontageEnded, DashMontage); + } + } +} + +void APlatformingCharacter::DoJumpStart() +{ + // handle special jump cases + MultiJump(); +} + +void APlatformingCharacter::DoJumpEnd() +{ + // stop jumping + StopJumping(); +} + +void APlatformingCharacter::DashMontageEnded(UAnimMontage* Montage, bool bInterrupted) +{ + // end the dash + EndDash(); +} + +void APlatformingCharacter::EndDash() +{ + // restore gravity + GetCharacterMovement()->GravityScale = 2.5f; + + // reset the dashing flag + bIsDashing = false; + + // are we grounded after the dash? + if (GetCharacterMovement()->IsMovingOnGround()) + { + // reset the dash usage flag, since we won't receive a landed event + bHasDashed = false; + + // deactivate the jump trails + SetJumpTrailState(false); + } +} + +bool APlatformingCharacter::HasDoubleJumped() const +{ + return bHasDoubleJumped; +} + +bool APlatformingCharacter::HasWallJumped() const +{ + return bHasWallJumped; +} + +void APlatformingCharacter::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the wall jump reset timer + GetWorld()->GetTimerManager().ClearTimer(WallJumpTimer); +} + +void APlatformingCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + + // Jumping + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &APlatformingCharacter::DoJumpStart); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &APlatformingCharacter::DoJumpEnd); + + // Moving + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &APlatformingCharacter::Move); + EnhancedInputComponent->BindAction(MouseLookAction, ETriggerEvent::Triggered, this, &APlatformingCharacter::Look); + + // Looking + EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &APlatformingCharacter::Look); + + // Dashing + EnhancedInputComponent->BindAction(DashAction, ETriggerEvent::Triggered, this, &APlatformingCharacter::Dash); + } +} + +void APlatformingCharacter::Landed(const FHitResult& Hit) +{ + Super::Landed(Hit); + + // reset the double jump and dash flags + bHasDoubleJumped = false; + bHasDashed = false; + + // deactivate the jump trail + SetJumpTrailState(false); +} + +void APlatformingCharacter::OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode /*= 0*/) +{ + Super::OnMovementModeChanged(PrevMovementMode, PreviousCustomMode); + + // are we falling? + if (GetCharacterMovement()->MovementMode == EMovementMode::MOVE_Falling) + { + // save the game time when we started falling, so we can check it later for coyote time jumps + LastFallTime = GetWorld()->GetTimeSeconds(); + } +} + diff --git a/Source/AgrarianGame/Variant_Platforming/PlatformingCharacter.h b/Source/AgrarianGame/Variant_Platforming/PlatformingCharacter.h new file mode 100644 index 0000000..1ba2a69 --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/PlatformingCharacter.h @@ -0,0 +1,194 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "Animation/AnimInstance.h" +#include "PlatformingCharacter.generated.h" + + +class USpringArmComponent; +class UCameraComponent; +class UInputAction; +struct FInputActionValue; +class UAnimMontage; + +/** + * An enhanced Third Person Character with the following functionality: + * - Platforming game character movement physics + * - Press and Hold Jump + * - Double Jump + * - Wall Jump + * - Dash + */ +UCLASS(abstract) +class APlatformingCharacter : public ACharacter +{ + GENERATED_BODY() + + /** Camera boom positioning the camera behind the character */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USpringArmComponent* CameraBoom; + + /** Follow camera */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UCameraComponent* FollowCamera; + +protected: + + /** Jump Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* JumpAction; + + /** Move Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* MoveAction; + + /** Look Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* LookAction; + + /** Mouse Look Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* MouseLookAction; + + /** Dash Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* DashAction; + +public: + + /** Constructor */ + APlatformingCharacter(); + +protected: + + /** Called for movement input */ + void Move(const FInputActionValue& Value); + + /** Called for looking input */ + void Look(const FInputActionValue& Value); + + /** Called for dash input */ + void Dash(); + + /** Called for jump pressed to check for advanced multi-jump conditions */ + void MultiJump(); + + /** Resets the wall jump input lock */ + void ResetWallJump(); + +public: + + /** Handles move inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoMove(float Right, float Forward); + + /** Handles look inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoLook(float Yaw, float Pitch); + + /** Handles dash inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoDash(); + + /** Handles jump pressed inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpStart(); + + /** Handles jump pressed inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpEnd(); + +protected: + + /** Called from a delegate when the dash montage ends */ + void DashMontageEnded(UAnimMontage* Montage, bool bInterrupted); + + /** Passes control to Blueprint to enable or disable jump trails */ + UFUNCTION(BlueprintImplementableEvent, Category="Platforming") + void SetJumpTrailState(bool bEnabled); + +public: + + /** Ends the dash state */ + void EndDash(); + +public: + + /** Returns true if the character has just double jumped */ + UFUNCTION(BlueprintPure, Category="Platforming") + bool HasDoubleJumped() const; + + /** Returns true if the character has just wall jumped */ + UFUNCTION(BlueprintPure, Category="Platforming") + bool HasWallJumped() const; + +public: + + /** EndPlay cleanup */ + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + /** Sets up input action bindings */ + virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + + /** Handle landings to reset dash and advanced jump state */ + virtual void Landed(const FHitResult& Hit) override; + + /** Handle movement mode changes to keep track of coyote time jumps */ + virtual void OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode = 0) override; + +protected: + + /** movement state flag bits, packed into a uint8 for memory efficiency */ + uint8 bHasWallJumped : 1; + uint8 bHasDoubleJumped : 1; + uint8 bHasDashed : 1; + uint8 bIsDashing : 1; + + /** timer for wall jump input reset */ + FTimerHandle WallJumpTimer; + + /** Dash montage ended delegate */ + FOnMontageEnded OnDashMontageEnded; + + /** Distance to trace ahead of the character to look for walls to jump from */ + UPROPERTY(EditAnywhere, Category="Wall Jump", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm")) + float WallJumpTraceDistance = 50.0f; + + /** Radius of the wall jump sphere trace check */ + UPROPERTY(EditAnywhere, Category="Wall Jump", meta = (ClampMin = 0, ClampMax = 100, Units = "cm")) + float WallJumpTraceRadius = 25.0f; + + /** Impulse to apply away from the wall when wall jumping */ + UPROPERTY(EditAnywhere, Category="Wall Jump", meta = (ClampMin = 0, ClampMax = 10000, Units = "cm/s")) + float WallJumpBounceImpulse = 800.0f; + + /** Vertical impulse to apply when wall jumping */ + UPROPERTY(EditAnywhere, Category="Wall Jump", meta = (ClampMin = 0, ClampMax = 10000, Units = "cm/s")) + float WallJumpVerticalImpulse = 900.0f; + + /** Time to ignore jump inputs after a wall jump */ + UPROPERTY(EditAnywhere, Category="Wall Jump", meta = (ClampMin = 0, ClampMax = 5, Units = "s")) + float DelayBetweenWallJumps = 0.1f; + + /** AnimMontage to use for the Dash action */ + UPROPERTY(EditAnywhere, Category="Dash") + UAnimMontage* DashMontage; + + /** Last recorded time when this character started falling */ + float LastFallTime = 0.0f; + + /** Max amount of time that can pass since we started falling when we allow a regular jump */ + UPROPERTY(EditAnywhere, Category="Coyote Time", meta = (ClampMin = 0, ClampMax = 5, Units = "s")) + float MaxCoyoteTime = 0.16f; + +public: + /** Returns CameraBoom subobject **/ + FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; } + + /** Returns FollowCamera subobject **/ + FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; } + +}; diff --git a/Source/AgrarianGame/Variant_Platforming/PlatformingGameMode.cpp b/Source/AgrarianGame/Variant_Platforming/PlatformingGameMode.cpp new file mode 100644 index 0000000..69de2c5 --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/PlatformingGameMode.cpp @@ -0,0 +1,9 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Platforming/PlatformingGameMode.h" + +APlatformingGameMode::APlatformingGameMode() +{ + // stub +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_Platforming/PlatformingGameMode.h b/Source/AgrarianGame/Variant_Platforming/PlatformingGameMode.h new file mode 100644 index 0000000..00c48bf --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/PlatformingGameMode.h @@ -0,0 +1,21 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "PlatformingGameMode.generated.h" + +/** + * Simple GameMode for a third person platforming game + */ +UCLASS() +class APlatformingGameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + + /** Constructor */ + APlatformingGameMode(); +}; diff --git a/Source/AgrarianGame/Variant_Platforming/PlatformingPlayerController.cpp b/Source/AgrarianGame/Variant_Platforming/PlatformingPlayerController.cpp new file mode 100644 index 0000000..e937aab --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/PlatformingPlayerController.cpp @@ -0,0 +1,98 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Platforming/PlatformingPlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "InputMappingContext.h" +#include "Kismet/GameplayStatics.h" +#include "GameFramework/PlayerStart.h" +#include "PlatformingCharacter.h" +#include "Engine/LocalPlayer.h" +#include "Engine/World.h" +#include "Blueprint/UserWidget.h" +#include "AgrarianGame.h" +#include "Widgets/Input/SVirtualJoystick.h" + +void APlatformingPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // only spawn touch controls on local player controllers + if (ShouldUseTouchControls() && IsLocalPlayerController()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(LogAgrarianGame, Error, TEXT("Could not spawn mobile controls widget.")); + + } + + } +} + +void APlatformingPlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // add the input mapping context + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!ShouldUseTouchControls()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } +} + +void APlatformingPlayerController::OnPossess(APawn* InPawn) +{ + Super::OnPossess(InPawn); + + // subscribe to the pawn's OnDestroyed delegate + InPawn->OnDestroyed.AddDynamic(this, &APlatformingPlayerController::OnPawnDestroyed); +} + +void APlatformingPlayerController::OnPawnDestroyed(AActor* DestroyedActor) +{ + // find the player start + TArray ActorList; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerStart::StaticClass(), ActorList); + + if (ActorList.Num() > 0) + { + // spawn a character at the player start + const FTransform SpawnTransform = ActorList[0]->GetActorTransform(); + + if (APlatformingCharacter* RespawnedCharacter = GetWorld()->SpawnActor(CharacterClass, SpawnTransform)) + { + // possess the character + Possess(RespawnedCharacter); + } + } +} + +bool APlatformingPlayerController::ShouldUseTouchControls() const +{ + // are we on a mobile platform? Should we force touch? + return SVirtualJoystick::ShouldDisplayTouchInterface() || bForceTouchControls; +} diff --git a/Source/AgrarianGame/Variant_Platforming/PlatformingPlayerController.h b/Source/AgrarianGame/Variant_Platforming/PlatformingPlayerController.h new file mode 100644 index 0000000..64f8420 --- /dev/null +++ b/Source/AgrarianGame/Variant_Platforming/PlatformingPlayerController.h @@ -0,0 +1,65 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "PlatformingPlayerController.generated.h" + +class UInputMappingContext; +class APlatformingCharacter; + +/** + * Simple Player Controller for a third person platforming game + * Manages input mappings + * Respawns the player character at the Player Start when it's destroyed + */ +UCLASS(abstract, Config="Game") +class APlatformingPlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Input mapping context for this player */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + UPROPERTY() + TObjectPtr MobileControlsWidget; + + /** If true, the player will use UMG touch controls even if not playing on mobile platforms */ + UPROPERTY(EditAnywhere, Config, Category = "Input|Touch Controls") + bool bForceTouchControls = false; + + /** Character class to respawn when the possessed pawn is destroyed */ + UPROPERTY(EditAnywhere, Category="Respawn") + TSubclassOf CharacterClass; + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Initialize input bindings */ + virtual void SetupInputComponent() override; + + /** Pawn initialization */ + virtual void OnPossess(APawn* InPawn) override; + + /** Called if the possessed pawn is destroyed */ + UFUNCTION() + void OnPawnDestroyed(AActor* DestroyedActor); + + /** Returns true if the player should use UMG touch controls */ + bool ShouldUseTouchControls() const; +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingAIController.cpp b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingAIController.cpp new file mode 100644 index 0000000..e025986 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingAIController.cpp @@ -0,0 +1,19 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingAIController.h" +#include "GameplayStateTreeModule/Public/Components/StateTreeAIComponent.h" + +ASideScrollingAIController::ASideScrollingAIController() +{ + // create the StateTree AI Component + StateTreeAI = CreateDefaultSubobject(TEXT("StateTreeAI")); + check(StateTreeAI); + + // ensure we start the StateTree when we possess the pawn + bStartAILogicOnPossess = true; + + // ensure we're attached to the possessed character. + // this is necessary for EnvQueries to work correctly + bAttachToPawn = true; +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingAIController.h b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingAIController.h new file mode 100644 index 0000000..f314e90 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingAIController.h @@ -0,0 +1,27 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "AIController.h" +#include "SideScrollingAIController.generated.h" + +class UStateTreeAIComponent; + +/** + * A basic AI Controller capable of running StateTree + */ +UCLASS(abstract) +class ASideScrollingAIController : public AAIController +{ + GENERATED_BODY() + + /** StateTree Component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AI", meta = (AllowPrivateAccess = "true")) + UStateTreeAIComponent* StateTreeAI; + +public: + + /** Constructor */ + ASideScrollingAIController(); +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingNPC.cpp b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingNPC.cpp new file mode 100644 index 0000000..1b5b26c --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingNPC.cpp @@ -0,0 +1,53 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingNPC.h" +#include "Engine/World.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "TimerManager.h" + +ASideScrollingNPC::ASideScrollingNPC() +{ + PrimaryActorTick.bCanEverTick = true; + + GetCharacterMovement()->MaxWalkSpeed = 150.0f; +} + +void ASideScrollingNPC::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the deactivation timer + GetWorld()->GetTimerManager().ClearTimer(DeactivationTimer); +} + +void ASideScrollingNPC::Interaction(AActor* Interactor) +{ + // ignore if this NPC has already been deactivated + if (bDeactivated) + { + return; + } + + // reset the deactivation flag + bDeactivated = true; + + // stop character movement immediately + GetCharacterMovement()->StopMovementImmediately(); + + // launch the NPC away from the interactor + FVector LaunchVector = Interactor->GetActorForwardVector() * LaunchImpulse; + LaunchVector.Y = 0.0f; + LaunchVector.Z = LaunchVerticalImpulse; + + LaunchCharacter(LaunchVector, true, true); + + // set up a timer to schedule reactivation + GetWorld()->GetTimerManager().SetTimer(DeactivationTimer, this, &ASideScrollingNPC::ResetDeactivation, DeactivationTime, false); +} + +void ASideScrollingNPC::ResetDeactivation() +{ + // reset the deactivation flag + bDeactivated = false; +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingNPC.h b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingNPC.h new file mode 100644 index 0000000..ee47560 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingNPC.h @@ -0,0 +1,64 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "SideScrollingInteractable.h" +#include "SideScrollingNPC.generated.h" + +/** + * Simple platforming NPC + * Its behaviors will be dictated by a possessing AI Controller + * It can be temporarily deactivated through Actor interactions + */ +UCLASS(abstract) +class ASideScrollingNPC : public ACharacter, public ISideScrollingInteractable +{ + GENERATED_BODY() + +protected: + + /** Horizontal impulse to apply to the NPC when it's interacted with */ + UPROPERTY(EditAnywhere, Category="NPC", meta = (ClampMin = 0, ClampMax = 10000, Units="cm/s")) + float LaunchImpulse = 500.0f; + + /** Vertical impulse to apply to the NPC when it's interacted with */ + UPROPERTY(EditAnywhere, Category="NPC", meta = (ClampMin = 0, ClampMax = 10000, Units="cm/s")) + float LaunchVerticalImpulse = 500.0f; + + /** Time that the NPC remains deactivated after being interacted with */ + UPROPERTY(EditAnywhere, Category="NPC", meta = (ClampMin = 0, ClampMax = 10, Units="s")) + float DeactivationTime = 3.0f; + +public: + + /** If true, this NPC is deactivated and will not be interacted with */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="NPC") + bool bDeactivated = false; + + /** Timer to reactivate the NPC */ + FTimerHandle DeactivationTimer; + +public: + + /** Constructor */ + ASideScrollingNPC(); + +public: + + /** Cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + +public: + +// ~begin IInteractable interface + + /** Performs an interaction triggered by another actor */ + virtual void Interaction(AActor* Interactor) override; + +// ~end IInteractable interface + + /** Reactivates the NPC */ + void ResetDeactivation(); +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingStateTreeUtility.cpp b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingStateTreeUtility.cpp new file mode 100644 index 0000000..489e0ca --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingStateTreeUtility.cpp @@ -0,0 +1,32 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingStateTreeUtility.h" +#include "StateTreeExecutionContext.h" +#include "StateTreeExecutionTypes.h" +#include "AIController.h" +#include "Kismet/GameplayStatics.h" + +EStateTreeRunStatus FStateTreeGetPlayerTask::Tick(FStateTreeExecutionContext& Context, const float DeltaTime) const +{ + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // set the player pawn as the target + InstanceData.TargetPlayer = UGameplayStatics::GetPlayerPawn(InstanceData.Controller.Get(), 0); + + // are the NPC and target valid? + if (IsValid(InstanceData.TargetPlayer) && IsValid(InstanceData.NPC)) + { + InstanceData.bValidTarget = FVector::Distance(InstanceData.NPC->GetActorLocation(), InstanceData.TargetPlayer->GetActorLocation()) < InstanceData.RangeMax; + } + + return EStateTreeRunStatus::Running; +} + +#if WITH_EDITOR +FText FStateTreeGetPlayerTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Get Player"); +} +#endif // WITH_EDITOR \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingStateTreeUtility.h b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingStateTreeUtility.h new file mode 100644 index 0000000..ebed7d1 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/AI/SideScrollingStateTreeUtility.h @@ -0,0 +1,59 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "StateTreeTaskBase.h" + +#include "SideScrollingStateTreeUtility.generated.h" + +class AAIController; + +/** + * Instance data for the FStateTreeGetPlayerTask task + */ +USTRUCT() +struct FStateTreeGetPlayerInstanceData +{ + GENERATED_BODY() + + /** NPC owning this task */ + UPROPERTY(VisibleAnywhere, Category="Context") + TObjectPtr NPC; + + /** Holds the found player pawn */ + UPROPERTY(VisibleAnywhere, Category="Context") + TObjectPtr Controller; + + /** Holds the found player pawn */ + UPROPERTY(VisibleAnywhere, Category="Output") + TObjectPtr TargetPlayer; + + /** Is the pawn close enough to be considered a valid target? */ + UPROPERTY(VisibleAnywhere, Category="Output") + bool bValidTarget = false; + + /** Max distance to be considered a valid target */ + UPROPERTY(EditAnywhere, Category="Parameter", meta = (ClampMin = 0, ClampMax = 10000, Units = "cm")) + float RangeMax = 1000.0f; +}; + +/** + * StateTree task to get the player-controlled character + */ +USTRUCT(meta=(DisplayName="Get Player", Category="Side Scrolling")) +struct FStateTreeGetPlayerTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeGetPlayerInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs while the owning state is active */ + virtual EStateTreeRunStatus Tick(FStateTreeExecutionContext& Context, const float DeltaTime) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingJumpPad.cpp b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingJumpPad.cpp new file mode 100644 index 0000000..d98c665 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingJumpPad.cpp @@ -0,0 +1,46 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingJumpPad.h" +#include "Components/BoxComponent.h" +#include "GameFramework/Character.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "Components/SceneComponent.h" + +ASideScrollingJumpPad::ASideScrollingJumpPad() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the root comp + RootComponent = CreateDefaultSubobject(TEXT("Root")); + + // create the bounding box + Box = CreateDefaultSubobject(TEXT("Box")); + Box->SetupAttachment(RootComponent); + + // configure the bounding box + Box->SetBoxExtent(FVector(115.0f, 90.0f, 20.0f), false); + Box->SetRelativeLocation(FVector(0.0f, 0.0f, 16.0f)); + + Box->SetCollisionObjectType(ECC_WorldDynamic); + Box->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + Box->SetCollisionResponseToAllChannels(ECR_Ignore); + Box->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); + + // add the overlap handler + OnActorBeginOverlap.AddDynamic(this, &ASideScrollingJumpPad::BeginOverlap); +} + +void ASideScrollingJumpPad::BeginOverlap(AActor* OverlappedActor, AActor* OtherActor) +{ + // were we overlapped by a character? + if (ACharacter* OverlappingCharacter = Cast(OtherActor)) + { + // force the character to jump + OverlappingCharacter->Jump(); + + // launch the character to override its vertical velocity + FVector LaunchVelocity = FVector::UpVector * ZStrength; + OverlappingCharacter->LaunchCharacter(LaunchVelocity, false, true); + } +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingJumpPad.h b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingJumpPad.h new file mode 100644 index 0000000..c503b4b --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingJumpPad.h @@ -0,0 +1,39 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "SideScrollingJumpPad.generated.h" + +class UBoxComponent; + +/** + * A simple jump pad that launches characters into the air + */ +UCLASS(abstract) +class ASideScrollingJumpPad : public AActor +{ + GENERATED_BODY() + + /** Jump pad bounding box */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UBoxComponent* Box; + +protected: + + /** Vertical velocity to set the character to when they use the jump pad */ + UPROPERTY(EditAnywhere, Category="Jump Pad", meta = (ClampMin=0, ClampMax=10000, Units="cm/s")) + float ZStrength = 1000.0f; + +public: + + /** Constructor */ + ASideScrollingJumpPad(); + +protected: + + UFUNCTION() + void BeginOverlap(AActor* OverlappedActor, AActor* OtherActor); + +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingMovingPlatform.cpp b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingMovingPlatform.cpp new file mode 100644 index 0000000..7c5b7a8 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingMovingPlatform.cpp @@ -0,0 +1,40 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingMovingPlatform.h" +#include "Components/SceneComponent.h" + +ASideScrollingMovingPlatform::ASideScrollingMovingPlatform() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the root comp + RootComponent = CreateDefaultSubobject(TEXT("Root")); +} + +void ASideScrollingMovingPlatform::Interaction(AActor* Interactor) +{ + // ignore interactions if we're already moving + if (bMoving) + { + return; + } + + // raise the movement flag + bMoving = true; + + // pass control to BP for the actual movement + BP_MoveToTarget(); +} + +void ASideScrollingMovingPlatform::ResetInteraction() +{ + // ignore if this is a one-shot platform + if (bOneShot) + { + return; + } + + // reset the movement flag + bMoving = false; +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingMovingPlatform.h b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingMovingPlatform.h new file mode 100644 index 0000000..6b89732 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingMovingPlatform.h @@ -0,0 +1,60 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "SideScrollingInteractable.h" +#include "SideScrollingMovingPlatform.generated.h" + +/** + * Simple moving platform that can be triggered through interactions by other actors. + * The actual movement is performed by Blueprint code through latent execution nodes. + */ +UCLASS(abstract) +class ASideScrollingMovingPlatform : public AActor, public ISideScrollingInteractable +{ + GENERATED_BODY() + +public: + + /** Constructor */ + ASideScrollingMovingPlatform(); + +protected: + + /** If this is true, the platform is mid-movement and will ignore further interactions */ + bool bMoving = false; + + /** Destination of the platform in world space */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Moving Platform") + FVector PlatformTarget; + + /** Time for the platform to move to the destination */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Moving Platform", meta = (ClampMin = 0, ClampMax = 10, Units="s")) + float MoveDuration = 5.0f; + + /** If this is true, the platform will only move once. */ + UPROPERTY(EditAnywhere, Category="Moving Platform") + bool bOneShot = false; + +public: + +// ~begin IInteractable interface + + /** Performs an interaction triggered by another actor */ + virtual void Interaction(AActor* Interactor) override; + +// ~end IInteractable interface + + /** Resets the interaction state. Must be called from BP code to reset the platform */ + UFUNCTION(BlueprintCallable, Category="Moving Platform") + virtual void ResetInteraction(); + +protected: + + /** Allows Blueprint code to do the actual platform movement */ + UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category="Moving Platform", meta = (DisplayName="Move to Target")) + void BP_MoveToTarget(); + +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingPickup.cpp b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingPickup.cpp new file mode 100644 index 0000000..bbe3753 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingPickup.cpp @@ -0,0 +1,55 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingPickup.h" +#include "GameFramework/Character.h" +#include "SideScrollingGameMode.h" +#include "Components/SphereComponent.h" +#include "Components/SceneComponent.h" +#include "Engine/World.h" + +ASideScrollingPickup::ASideScrollingPickup() +{ + PrimaryActorTick.bCanEverTick = false; + + // create the root comp + RootComponent = CreateDefaultSubobject(TEXT("Root")); + + // create the bounding sphere + Sphere = CreateDefaultSubobject(TEXT("Collision")); + Sphere->SetupAttachment(RootComponent); + + Sphere->SetSphereRadius(100.0f); + + Sphere->SetCollisionObjectType(ECC_WorldDynamic); + Sphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + Sphere->SetCollisionResponseToAllChannels(ECR_Ignore); + Sphere->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); + + // add the overlap handler + OnActorBeginOverlap.AddDynamic(this, &ASideScrollingPickup::BeginOverlap); +} + +void ASideScrollingPickup::BeginOverlap(AActor* OverlappedActor, AActor* OtherActor) +{ + // have we collided against a character? + if (ACharacter* OverlappedCharacter = Cast(OtherActor)) + { + // is this the player character? + if (OverlappedCharacter->IsPlayerControlled()) + { + // get the game mode + if (ASideScrollingGameMode* GM = Cast(GetWorld()->GetAuthGameMode())) + { + // tell the game mode to process a pickup + GM->ProcessPickup(); + + // disable collision so we don't get picked up again + SetActorEnableCollision(false); + + // Call the BP handler. It will be responsible for destroying the pickup + BP_OnPickedUp(); + } + } + } +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingPickup.h b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingPickup.h new file mode 100644 index 0000000..80e80d0 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingPickup.h @@ -0,0 +1,38 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "SideScrollingPickup.generated.h" + +class USphereComponent; + +/** + * A simple side scrolling game pickup + * Increments a counter on the GameMode + */ +UCLASS(abstract) +class ASideScrollingPickup : public AActor +{ + GENERATED_BODY() + + /** Pickup bounding sphere */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category ="Components", meta = (AllowPrivateAccess = "true")) + USphereComponent* Sphere; + +public: + + /** Constructor */ + ASideScrollingPickup(); + +protected: + + /** Handles pickup collision */ + UFUNCTION() + void BeginOverlap(AActor* OverlappedActor, AActor* OtherActor); + + /** Passes control to BP to play effects on pickup */ + UFUNCTION(BlueprintImplementableEvent, Category="Pickup", meta = (DisplayName = "On Picked Up")) + void BP_OnPickedUp(); +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingSoftPlatform.cpp b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingSoftPlatform.cpp new file mode 100644 index 0000000..81f9139 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingSoftPlatform.cpp @@ -0,0 +1,59 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingSoftPlatform.h" +#include "Components/SceneComponent.h" +#include "Components/StaticMeshComponent.h" +#include "Components/BoxComponent.h" +#include "SideScrollingCharacter.h" + +ASideScrollingSoftPlatform::ASideScrollingSoftPlatform() +{ + PrimaryActorTick.bCanEverTick = true; + + // create the root component + RootComponent = Root = CreateDefaultSubobject(TEXT("Root")); + + // create the mesh + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + Mesh->SetupAttachment(Root); + + Mesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); + Mesh->SetCollisionObjectType(ECC_WorldStatic); + Mesh->SetCollisionResponseToAllChannels(ECR_Block); + + // create the collision check box + CollisionCheckBox = CreateDefaultSubobject(TEXT("Collision Check Box")); + CollisionCheckBox->SetupAttachment(Mesh); + + CollisionCheckBox->SetRelativeLocation(FVector(0.0f, 0.0f, -40.0f)); + CollisionCheckBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + CollisionCheckBox->SetCollisionObjectType(ECC_WorldDynamic); + CollisionCheckBox->SetCollisionResponseToAllChannels(ECR_Ignore); + CollisionCheckBox->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); + + // subscribe to the overlap events + CollisionCheckBox->OnComponentBeginOverlap.AddDynamic(this, &ASideScrollingSoftPlatform::OnSoftCollisionOverlap); +} + +void ASideScrollingSoftPlatform::OnSoftCollisionOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + // have we overlapped a character? + if (ASideScrollingCharacter* Char = Cast(OtherActor)) + { + // disable the soft collision channel + Char->SetSoftCollision(true); + } +} + +void ASideScrollingSoftPlatform::NotifyActorEndOverlap(AActor* OtherActor) +{ + Super::NotifyActorEndOverlap(OtherActor); + + // have we overlapped a character? + if (ASideScrollingCharacter* Char = Cast(OtherActor)) + { + // enable the soft collision channel + Char->SetSoftCollision(false); + } +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingSoftPlatform.h b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingSoftPlatform.h new file mode 100644 index 0000000..04ed012 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Gameplay/SideScrollingSoftPlatform.h @@ -0,0 +1,46 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "SideScrollingSoftPlatform.generated.h" + +class USceneComponent; +class UStaticMeshComponent; +class UBoxComponent; + +/** + * A side scrolling game platform that the character can jump or drop through. + */ +UCLASS(abstract) +class ASideScrollingSoftPlatform : public AActor +{ + GENERATED_BODY() + + /** Root component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category ="Components", meta = (AllowPrivateAccess = "true")) + USceneComponent* Root; + + /** Platform mesh. The part we collide against and see */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category ="Components", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* Mesh; + + /** Collision volume that toggles soft collision on the character when they're below the platform. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category ="Components", meta = (AllowPrivateAccess = "true")) + UBoxComponent* CollisionCheckBox; + +public: + + /** Constructor */ + ASideScrollingSoftPlatform(); + +protected: + + /** Handles soft collision check box overlaps */ + UFUNCTION() + void OnSoftCollisionOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + + /** Restores soft collision state when overlap ends */ + virtual void NotifyActorEndOverlap(AActor* OtherActor) override; +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/Interfaces/SideScrollingInteractable.cpp b/Source/AgrarianGame/Variant_SideScrolling/Interfaces/SideScrollingInteractable.cpp new file mode 100644 index 0000000..d44da2b --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Interfaces/SideScrollingInteractable.cpp @@ -0,0 +1,6 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingInteractable.h" + +// Add default functionality here for any IInteractable functions that are not pure virtual. diff --git a/Source/AgrarianGame/Variant_SideScrolling/Interfaces/SideScrollingInteractable.h b/Source/AgrarianGame/Variant_SideScrolling/Interfaces/SideScrollingInteractable.h new file mode 100644 index 0000000..05d43d1 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/Interfaces/SideScrollingInteractable.h @@ -0,0 +1,31 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "SideScrollingInteractable.generated.h" + +/** + * + */ +UINTERFACE(MinimalAPI, NotBlueprintable) +class USideScrollingInteractable : public UInterface +{ + GENERATED_BODY() +}; + +/** + * Simple interface to allow Actors to interact without having knowledge of their internal implementation. + */ +class ISideScrollingInteractable +{ + GENERATED_BODY() + +public: + + /** Triggers an interaction by the provided Actor */ + UFUNCTION(BlueprintCallable, Category="Interactable") + virtual void Interaction(AActor* Interactor) = 0; + +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCameraManager.cpp b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCameraManager.cpp new file mode 100644 index 0000000..9aa30ac --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCameraManager.cpp @@ -0,0 +1,105 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingCameraManager.h" +#include "GameFramework/Pawn.h" +#include "Engine/HitResult.h" +#include "CollisionQueryParams.h" +#include "Engine/World.h" + +void ASideScrollingCameraManager::UpdateViewTarget(FTViewTarget& OutVT, float DeltaTime) +{ + // ensure the view target is a pawn + APawn* TargetPawn = Cast(OutVT.Target); + + // is our target valid? + if (IsValid(TargetPawn)) + { + // set the view target FOV and rotation + OutVT.POV.Rotation = FRotator(0.0f, -90.0f, 0.0f); + OutVT.POV.FOV = 65.0f; + + // cache the current location + FVector CurrentActorLocation = OutVT.Target->GetActorLocation(); + + // copy the current camera location + FVector CurrentCameraLocation = GetCameraLocation(); + + // calculate the "zoom distance" - in reality the distance we want to keep to the target + float CurrentY = CurrentZoom + CurrentActorLocation.Y; + + // do first-time setup + if (bSetup) + { + // lower the setup flag + bSetup = false; + + // initialize the camera viewpoint and return + OutVT.POV.Location.X = CurrentActorLocation.X; + OutVT.POV.Location.Y = CurrentY; + OutVT.POV.Location.Z = CurrentActorLocation.Z + CameraZOffset; + + // save the current camera height + CurrentZ = OutVT.POV.Location.Z; + + // skip the rest of the calculations + return; + } + + // check if the camera needs to update its height + bool bZUpdate = false; + + // is the character moving vertically? + if (FMath::IsNearlyZero(TargetPawn->GetVelocity().Z)) + { + // determine if we need to do a height update + bZUpdate = FMath::IsNearlyEqual(CurrentZ, CurrentCameraLocation.Z, 25.0f); + + } else { + + // run a trace below the character to determine if we need to do a height update + FHitResult OutHit; + + const FVector End = CurrentActorLocation + FVector(0.0f, 0.0f, -1000.0f); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(TargetPawn); + + // only update height if we're not about to hit ground + bZUpdate = !GetWorld()->LineTraceSingleByChannel(OutHit, CurrentActorLocation, End, ECC_Visibility, QueryParams); + + } + + // do we need to do a height update? + if (bZUpdate) + { + + // set the height goal from the actor location + CurrentZ = CurrentActorLocation.Z; + + } else { + + // are we close enough to the target height? + if (FMath::IsNearlyEqual(CurrentZ, CurrentActorLocation.Z, 100.0f)) + { + // set the height goal from the actor location + CurrentZ = CurrentActorLocation.Z; + + } else { + + // blend the height towards the actor location + CurrentZ = FMath::FInterpTo(CurrentZ, CurrentActorLocation.Z, DeltaTime, 2.0f); + + } + + } + + // clamp the X axis to the min and max camera bounds + float CurrentX = FMath::Clamp(CurrentActorLocation.X, CameraXMinBounds, CameraXMaxBounds); + + // blend towards the new camera location and update the output + FVector TargetCameraLocation(CurrentX, CurrentY, CurrentZ); + + OutVT.POV.Location = FMath::VInterpTo(CurrentCameraLocation, TargetCameraLocation, DeltaTime, 2.0f); + } +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCameraManager.h b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCameraManager.h new file mode 100644 index 0000000..7286306 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCameraManager.h @@ -0,0 +1,47 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Camera/PlayerCameraManager.h" +#include "SideScrollingCameraManager.generated.h" + +/** + * Simple side scrolling camera with smooth scrolling and horizontal bounds + */ +UCLASS() +class ASideScrollingCameraManager : public APlayerCameraManager +{ + GENERATED_BODY() + +public: + + /** Overrides the default camera view target calculation */ + virtual void UpdateViewTarget(FTViewTarget& OutVT, float DeltaTime) override; + +public: + + /** How close we want to stay to the view target */ + UPROPERTY(EditAnywhere, Category="Side Scrolling Camera", meta=(ClampMin=0, ClampMax=10000, Units="cm")) + float CurrentZoom = 1000.0f; + + /** How far above the target do we want the camera to focus */ + UPROPERTY(EditAnywhere, Category="Side Scrolling Camera", meta=(ClampMin=0, ClampMax=10000, Units="cm")) + float CameraZOffset = 100.0f; + + /** Minimum camera scrolling bounds in world space */ + UPROPERTY(EditAnywhere, Category="Side Scrolling Camera", meta=(ClampMin=-100000, ClampMax=100000, Units="cm")) + float CameraXMinBounds = -400.0f; + + /** Maximum camera scrolling bounds in world space */ + UPROPERTY(EditAnywhere, Category="Side Scrolling Camera", meta=(ClampMin=-100000, ClampMax=100000, Units="cm")) + float CameraXMaxBounds = 10000.0f; + +protected: + + /** Last cached camera vertical location. The camera only adjusts its height if necessary. */ + float CurrentZ = 0.0f; + + /** First-time update camera setup flag */ + bool bSetup = true; +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCharacter.cpp b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCharacter.cpp new file mode 100644 index 0000000..b11faa5 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCharacter.cpp @@ -0,0 +1,350 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingCharacter.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "Components/CapsuleComponent.h" +#include "Camera/CameraComponent.h" +#include "Components/InputComponent.h" +#include "InputActionValue.h" +#include "EnhancedInputComponent.h" +#include "InputAction.h" +#include "Engine/World.h" +#include "SideScrollingInteractable.h" +#include "Kismet/KismetMathLibrary.h" +#include "TimerManager.h" + +ASideScrollingCharacter::ASideScrollingCharacter() +{ + PrimaryActorTick.bCanEverTick = true; + + // create the camera component + Camera = CreateDefaultSubobject(TEXT("Camera")); + Camera->SetupAttachment(RootComponent); + + Camera->SetRelativeLocationAndRotation(FVector(0.0f, 300.0f, 0.0f), FRotator(0.0f, -90.0f, 0.0f)); + + // configure the collision capsule + GetCapsuleComponent()->SetCapsuleSize(35.0f, 90.0f); + + // configure the Pawn properties + bUseControllerRotationYaw = false; + + // configure the character movement component + GetCharacterMovement()->GravityScale = 1.75f; + GetCharacterMovement()->MaxAcceleration = 1500.0f; + GetCharacterMovement()->BrakingFrictionFactor = 1.0f; + GetCharacterMovement()->bUseSeparateBrakingFriction = true; + GetCharacterMovement()->Mass = 500.0f; + + GetCharacterMovement()->SetWalkableFloorAngle(75.0f); + GetCharacterMovement()->MaxWalkSpeed = 500.0f; + GetCharacterMovement()->MinAnalogWalkSpeed = 20.0f; + GetCharacterMovement()->BrakingDecelerationWalking = 2000.0f; + GetCharacterMovement()->bIgnoreBaseRotation = true; + + GetCharacterMovement()->PerchRadiusThreshold = 15.0f; + GetCharacterMovement()->LedgeCheckThreshold = 6.0f; + + GetCharacterMovement()->JumpZVelocity = 750.0f; + GetCharacterMovement()->AirControl = 1.0f; + + GetCharacterMovement()->RotationRate = FRotator(0.0f, 750.0f, 0.0f); + GetCharacterMovement()->bOrientRotationToMovement = true; + + GetCharacterMovement()->SetPlaneConstraintNormal(FVector(0.0f, 1.0f, 0.0f)); + GetCharacterMovement()->bConstrainToPlane = true; + + // enable double jump and coyote time + JumpMaxCount = 3; +} + +void ASideScrollingCharacter::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the wall jump timer + GetWorld()->GetTimerManager().ClearTimer(WallJumpTimer); +} + +void ASideScrollingCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) +{ + Super::SetupPlayerInputComponent(PlayerInputComponent); + + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + // Jumping + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ASideScrollingCharacter::DoJumpStart); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ASideScrollingCharacter::DoJumpEnd); + + // Interacting + EnhancedInputComponent->BindAction(InteractAction, ETriggerEvent::Triggered, this, &ASideScrollingCharacter::DoInteract); + + // Moving + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ASideScrollingCharacter::Move); + + // Dropping from platform + EnhancedInputComponent->BindAction(DropAction, ETriggerEvent::Triggered, this, &ASideScrollingCharacter::Drop); + EnhancedInputComponent->BindAction(DropAction, ETriggerEvent::Completed, this, &ASideScrollingCharacter::DropReleased); + + } +} + +void ASideScrollingCharacter::NotifyHit(class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) +{ + Super::NotifyHit(MyComp, Other, OtherComp, bSelfMoved, HitLocation, HitNormal, NormalImpulse, Hit); + + // only apply push impulse if we're falling + if (!GetCharacterMovement()->IsFalling()) + { + return; + } + + // ensure the colliding component is valid + if (OtherComp) + { + // ensure the component is movable and simulating physics + if (OtherComp->Mobility == EComponentMobility::Movable && OtherComp->IsSimulatingPhysics()) + { + const FVector PushDir = FVector(ActionValueY > 0.0f ? 1.0f : -1.0f, 0.0f, 0.0f); + + // push the component away + OtherComp->AddImpulse(PushDir * JumpPushImpulse, NAME_None, true); + } + } +} + +void ASideScrollingCharacter::Landed(const FHitResult& Hit) +{ + // reset the double jump + bHasDoubleJumped = false; +} + +void ASideScrollingCharacter::OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode /*= 0*/) +{ + Super::OnMovementModeChanged(PrevMovementMode, PreviousCustomMode); + + // are we falling? + if (GetCharacterMovement()->MovementMode == EMovementMode::MOVE_Falling) + { + // save the game time when we started falling, so we can check it later for coyote time jumps + LastFallTime = GetWorld()->GetTimeSeconds(); + } +} + +void ASideScrollingCharacter::Move(const FInputActionValue& Value) +{ + FVector2D MoveVector = Value.Get(); + + // route the input + DoMove(MoveVector.Y); +} + +void ASideScrollingCharacter::Drop(const FInputActionValue& Value) +{ + // route the input + DoDrop(Value.Get()); +} + +void ASideScrollingCharacter::DropReleased(const FInputActionValue& Value) +{ + // reset the input + DoDrop(0.0f); +} + +void ASideScrollingCharacter::DoMove(float Forward) +{ + // is movement temporarily disabled after wall jumping? + if (!bHasWallJumped) + { + // save the movement values + ActionValueY = Forward; + + // figure out the movement direction + const FVector MoveDir = FVector(1.0f, Forward > 0.0f ? 0.1f : -0.1f, 0.0f); + + // apply the movement input + AddMovementInput(MoveDir, Forward); + } +} + +void ASideScrollingCharacter::DoDrop(float Value) +{ + // save the movement value + DropValue = Value; +} + +void ASideScrollingCharacter::DoJumpStart() +{ + // handle advanced jump behaviors + MultiJump(); +} + +void ASideScrollingCharacter::DoJumpEnd() +{ + StopJumping(); +} + +void ASideScrollingCharacter::DoInteract() +{ + // do a sphere trace to look for interactive objects + FHitResult OutHit; + + const FVector Start = GetActorLocation(); + const FVector End = Start + FVector(100.0f, 0.0f, 0.0f); + + FCollisionShape ColSphere; + ColSphere.SetSphere(InteractionRadius); + + FCollisionObjectQueryParams ObjectParams; + ObjectParams.AddObjectTypesToQuery(ECC_Pawn); + ObjectParams.AddObjectTypesToQuery(ECC_WorldDynamic); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + if (GetWorld()->SweepSingleByObjectType(OutHit, Start, End, FQuat::Identity, ObjectParams, ColSphere, QueryParams)) + { + // have we hit an interactable? + if (ISideScrollingInteractable* Interactable = Cast(OutHit.GetActor())) + { + // interact + Interactable->Interaction(this); + } + } +} + +void ASideScrollingCharacter::MultiJump() +{ + // does the user want to drop to a lower platform? + if (DropValue > 0.0f) + { + CheckForSoftCollision(); + return; + } + + // reset the drop value + DropValue = 0.0f; + + // if we're grounded, disregard advanced jump logic + if (!GetCharacterMovement()->IsFalling()) + { + Jump(); + return; + } + + // if we have a horizontal input, try for wall jump first + if (!bHasWallJumped && !FMath::IsNearlyZero(ActionValueY)) + { + // trace ahead of the character for walls + FHitResult OutHit; + + const FVector Start = GetActorLocation(); + const FVector End = Start + (FVector(ActionValueY > 0.0f ? 1.0f : -1.0f, 0.0f, 0.0f) * WallJumpTraceDistance); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + GetWorld()->LineTraceSingleByChannel(OutHit, Start, End, ECC_Visibility, QueryParams); + + if (OutHit.bBlockingHit) + { + // rotate to the bounce direction + const FRotator BounceRot = UKismetMathLibrary::MakeRotFromX(OutHit.ImpactNormal); + SetActorRotation(FRotator(0.0f, BounceRot.Yaw, 0.0f)); + + // calculate the impulse vector + FVector WallJumpImpulse = OutHit.ImpactNormal * WallJumpHorizontalImpulse; + WallJumpImpulse.Z = GetCharacterMovement()->JumpZVelocity * WallJumpVerticalMultiplier; + + // launch the character away from the wall + LaunchCharacter(WallJumpImpulse, true, true); + + // enable wall jump lockout for a bit + bHasWallJumped = true; + + // schedule wall jump lockout reset + GetWorld()->GetTimerManager().SetTimer(WallJumpTimer, this, &ASideScrollingCharacter::ResetWallJump, DelayBetweenWallJumps, false); + + return; + } + } + + + + // test for double jump only if we haven't already tested for wall jump + if (!bHasWallJumped) + { + // are we still within coyote time frames? + if (GetWorld()->GetTimeSeconds() - LastFallTime < MaxCoyoteTime) + { + UE_LOG(LogTemp, Warning, TEXT("Coyote Jump")); + + // use the built-in CMC functionality to do the jump + Jump(); + + // no coyote time jump + } else { + + // The movement component handles double jump but we still need to manage the flag for animation + if (!bHasDoubleJumped) + { + // raise the double jump flag + bHasDoubleJumped = true; + + // let the CMC handle jump + Jump(); + } + } + } +} + +void ASideScrollingCharacter::CheckForSoftCollision() +{ + // reset the drop value + DropValue = 0.0f; + + // trace down + FHitResult OutHit; + + const FVector Start = GetActorLocation(); + const FVector End = Start + (FVector::DownVector * SoftCollisionTraceDistance); + + FCollisionObjectQueryParams ObjectParams; + ObjectParams.AddObjectTypesToQuery(SoftCollisionObjectType); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + GetWorld()->LineTraceSingleByObjectType(OutHit, Start, End, ObjectParams, QueryParams); + + // did we hit a soft floor? + if (OutHit.GetActor()) + { + // drop through the floor + SetSoftCollision(true); + } +} + +void ASideScrollingCharacter::ResetWallJump() +{ + // reset the wall jump flag + bHasWallJumped = false; +} + +void ASideScrollingCharacter::SetSoftCollision(bool bEnabled) +{ + // enable or disable collision response to the soft collision channel + GetCapsuleComponent()->SetCollisionResponseToChannel(SoftCollisionObjectType, bEnabled ? ECR_Ignore : ECR_Block); +} + +bool ASideScrollingCharacter::HasDoubleJumped() const +{ + return bHasDoubleJumped; +} + +bool ASideScrollingCharacter::HasWallJumped() const +{ + return bHasWallJumped; +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCharacter.h b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCharacter.h new file mode 100644 index 0000000..9815e8b --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingCharacter.h @@ -0,0 +1,180 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "SideScrollingCharacter.generated.h" + +class UCameraComponent; +class UInputAction; +struct FInputActionValue; + +/** + * A player-controllable character side scrolling game + */ +UCLASS(abstract) +class ASideScrollingCharacter : public ACharacter +{ + GENERATED_BODY() + + /** Player camera */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category ="Camera", meta = (AllowPrivateAccess = "true")) + UCameraComponent* Camera; + +protected: + + /** Move Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* MoveAction; + + /** Jump Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* JumpAction; + + /** Drop from Platform Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* DropAction; + + /** Interact Input Action */ + UPROPERTY(EditAnywhere, Category="Input") + UInputAction* InteractAction; + + /** Impulse to manually push physics objects while we're in midair */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Jump") + float JumpPushImpulse = 600.0f; + + /** Max distance that interactive objects can be triggered */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Interaction") + float InteractionRadius = 200.0f; + + /** Time to disable input after a wall jump to preserve momentum */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Wall Jump") + float DelayBetweenWallJumps = 0.3f; + + /** Distance to trace ahead of the character for wall jumps */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Wall Jump") + float WallJumpTraceDistance = 50.0f; + + /** Horizontal impulse to apply to the character during wall jumps */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Wall Jump") + float WallJumpHorizontalImpulse = 500.0f; + + /** Multiplies the jump Z velocity for wall jumps. */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Wall Jump") + float WallJumpVerticalMultiplier = 1.4f; + + /** Collision object type to use for soft collision traces (dropping down floors) */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Soft Platforms") + TEnumAsByte SoftCollisionObjectType; + + /** Distance to trace down during soft collision checks */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Soft Platforms") + float SoftCollisionTraceDistance = 1000.0f; + + /** Last recorded time when this character started falling */ + float LastFallTime = 0.0f; + + /** Max amount of time that can pass since we started falling when we allow a regular jump */ + UPROPERTY(EditAnywhere, Category="Side Scrolling|Coyote Time", meta = (ClampMin = 0, ClampMax = 5, Units = "s")) + float MaxCoyoteTime = 0.16f; + + /** Wall jump lockout timer */ + FTimerHandle WallJumpTimer; + + /** Last captured horizontal movement input value */ + float ActionValueY = 0.0f; + + /** Last captured platform drop axis value */ + float DropValue = 0.0f; + + /** If true, this character has already wall jumped */ + bool bHasWallJumped = false; + + /** If true, this character has already double jumped */ + bool bHasDoubleJumped = false; + + /** If true, this character is moving along the side scrolling axis */ + bool bMovingHorizontally = false; + +public: + + /** Constructor */ + ASideScrollingCharacter(); + +protected: + + /** Gameplay cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + + /** Initialize input action bindings */ + virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + + /** Collision handling */ + virtual void NotifyHit(class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) override; + + /** Landing handling */ + virtual void Landed(const FHitResult& Hit) override; + + /** Handle movement mode changes to keep track of coyote time jumps */ + virtual void OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode = 0) override; + +protected: + + /** Called for movement input */ + void Move(const FInputActionValue& Value); + + /** Called for drop from platform input */ + void Drop(const FInputActionValue& Value); + + /** Called for drop from platform input release */ + void DropReleased(const FInputActionValue& Value); + +public: + + /** Handles move inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoMove(float Forward); + + /** Handles drop inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoDrop(float Value); + + /** Handles jump pressed inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpStart(); + + /** Handles jump pressed inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpEnd(); + + /** Handles interact inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoInteract(); + +protected: + + /** Handles advanced jump logic */ + void MultiJump(); + + /** Checks for soft collision with platforms */ + void CheckForSoftCollision(); + + /** Resets wall jump lockout. Called from timer after a wall jump */ + void ResetWallJump(); + +public: + + /** Sets the soft collision response. True passes, False blocks */ + void SetSoftCollision(bool bEnabled); + +public: + + /** Returns true if the character has just double jumped */ + UFUNCTION(BlueprintPure, Category="Side Scrolling") + bool HasDoubleJumped() const; + + /** Returns true if the character has just wall jumped */ + UFUNCTION(BlueprintPure, Category="Side Scrolling") + bool HasWallJumped() const; +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingGameMode.cpp b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingGameMode.cpp new file mode 100644 index 0000000..1fa5246 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingGameMode.cpp @@ -0,0 +1,35 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingGameMode.h" +#include "Kismet/GameplayStatics.h" +#include "Blueprint/UserWidget.h" +#include "SideScrollingUI.h" +#include "SideScrollingPickup.h" + +void ASideScrollingGameMode::BeginPlay() +{ + Super::BeginPlay(); + + // create the game UI + APlayerController* OwningPlayer = UGameplayStatics::GetPlayerController(GetWorld(), 0); + + UserInterface = CreateWidget(OwningPlayer, UserInterfaceClass); + + check(UserInterface); +} + +void ASideScrollingGameMode::ProcessPickup() +{ + // increment the pickups counter + ++PickupsCollected; + + // if this is the first pickup we collect, show the UI + if (PickupsCollected == 1) + { + UserInterface->AddToViewport(0); + } + + // update the pickups counter on the UI + UserInterface->UpdatePickups(PickupsCollected); +} \ No newline at end of file diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingGameMode.h b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingGameMode.h new file mode 100644 index 0000000..a9d540a --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingGameMode.h @@ -0,0 +1,44 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "SideScrollingGameMode.generated.h" + +class USideScrollingUI; + +/** + * Simple Side Scrolling Game Mode + * Spawns and manages the game UI + * Counts pickups collected by the player + */ +UCLASS(abstract) +class ASideScrollingGameMode : public AGameModeBase +{ + GENERATED_BODY() + +protected: + + /** Class of UI widget to spawn when the game starts */ + UPROPERTY(EditAnywhere, Category="UI") + TSubclassOf UserInterfaceClass; + + /** User interface widget for the game */ + UPROPERTY(BlueprintReadOnly, Category="UI") + TObjectPtr UserInterface; + + /** Number of pickups collected by the player */ + UPROPERTY(BlueprintReadOnly, Category="Pickups") + int32 PickupsCollected = 0; + +protected: + + /** Initialization */ + virtual void BeginPlay() override; + +public: + + /** Receives an interaction event from another actor */ + virtual void ProcessPickup(); +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingPlayerController.cpp b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingPlayerController.cpp new file mode 100644 index 0000000..d80c42c --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingPlayerController.cpp @@ -0,0 +1,98 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingPlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "InputMappingContext.h" +#include "Kismet/GameplayStatics.h" +#include "GameFramework/PlayerStart.h" +#include "SideScrollingCharacter.h" +#include "Engine/LocalPlayer.h" +#include "Engine/World.h" +#include "Blueprint/UserWidget.h" +#include "AgrarianGame.h" +#include "Widgets/Input/SVirtualJoystick.h" + +void ASideScrollingPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // only spawn touch controls on local player controllers + if (ShouldUseTouchControls() && IsLocalPlayerController()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(LogAgrarianGame, Error, TEXT("Could not spawn mobile controls widget.")); + + } + + } +} + +void ASideScrollingPlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // add the input mapping context + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!ShouldUseTouchControls()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } +} + +void ASideScrollingPlayerController::OnPossess(APawn* InPawn) +{ + Super::OnPossess(InPawn); + + // subscribe to the pawn's OnDestroyed delegate + InPawn->OnDestroyed.AddDynamic(this, &ASideScrollingPlayerController::OnPawnDestroyed); +} + +void ASideScrollingPlayerController::OnPawnDestroyed(AActor* DestroyedActor) +{ + // find the player start + TArray ActorList; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerStart::StaticClass(), ActorList); + + if (ActorList.Num() > 0) + { + // spawn a character at the player start + const FTransform SpawnTransform = ActorList[0]->GetActorTransform(); + + if (ASideScrollingCharacter* RespawnedCharacter = GetWorld()->SpawnActor(CharacterClass, SpawnTransform)) + { + // possess the character + Possess(RespawnedCharacter); + } + } +} + +bool ASideScrollingPlayerController::ShouldUseTouchControls() const +{ + // are we on a mobile platform? Should we force touch? + return SVirtualJoystick::ShouldDisplayTouchInterface() || bForceTouchControls; +} diff --git a/Source/AgrarianGame/Variant_SideScrolling/SideScrollingPlayerController.h b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingPlayerController.h new file mode 100644 index 0000000..115029e --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/SideScrollingPlayerController.h @@ -0,0 +1,67 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "EnhancedInput/Public/InputAction.h" +#include "SideScrollingPlayerController.generated.h" + +class ASideScrollingCharacter; +class UInputMappingContext; + +/** + * A simple Side Scrolling Player Controller + * Manages input mappings + * Respawns the player pawn at the player start if it is destroyed + */ +UCLASS(abstract, Config="Game") +class ASideScrollingPlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Input mapping context for this player */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + UPROPERTY() + TObjectPtr MobileControlsWidget; + + /** If true, the player will use UMG touch controls even if not playing on mobile platforms */ + UPROPERTY(EditAnywhere, Config, Category = "Input|Touch Controls") + bool bForceTouchControls = false; + + /** Character class to respawn when the possessed pawn is destroyed */ + UPROPERTY(EditAnywhere, Category="Respawn") + TSubclassOf CharacterClass; + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Initialize input bindings */ + virtual void SetupInputComponent() override; + + /** Pawn initialization */ + virtual void OnPossess(APawn* InPawn) override; + + /** Called if the possessed pawn is destroyed */ + UFUNCTION() + void OnPawnDestroyed(AActor* DestroyedActor); + + /** Returns true if the player should use UMG touch controls */ + bool ShouldUseTouchControls() const; + +}; diff --git a/Source/AgrarianGame/Variant_SideScrolling/UI/SideScrollingUI.cpp b/Source/AgrarianGame/Variant_SideScrolling/UI/SideScrollingUI.cpp new file mode 100644 index 0000000..0a4e042 --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/UI/SideScrollingUI.cpp @@ -0,0 +1,5 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "SideScrollingUI.h" + diff --git a/Source/AgrarianGame/Variant_SideScrolling/UI/SideScrollingUI.h b/Source/AgrarianGame/Variant_SideScrolling/UI/SideScrollingUI.h new file mode 100644 index 0000000..a19cafd --- /dev/null +++ b/Source/AgrarianGame/Variant_SideScrolling/UI/SideScrollingUI.h @@ -0,0 +1,23 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "SideScrollingUI.generated.h" + +/** + * Simple Side Scrolling game UI + * Displays and manages a pickup counter + */ +UCLASS(abstract) +class USideScrollingUI : public UUserWidget +{ + GENERATED_BODY() + +public: + + /** Update the widget's pickup counter */ + UFUNCTION(BlueprintImplementableEvent, Category="UI") + void UpdatePickups(int32 Amount); +}; diff --git a/Source/AgrarianGameEditor.Target.cs b/Source/AgrarianGameEditor.Target.cs new file mode 100644 index 0000000..9e270d4 --- /dev/null +++ b/Source/AgrarianGameEditor.Target.cs @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; +using System.Collections.Generic; + +public class AgrarianGameEditorTarget : TargetRules +{ + public AgrarianGameEditorTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Editor; + DefaultBuildSettings = BuildSettingsVersion.V6; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_7; + ExtraModuleNames.Add("AgrarianGame"); + } +} diff --git a/shadertoolsconfig.json b/shadertoolsconfig.json new file mode 100644 index 0000000..07f2dc6 --- /dev/null +++ b/shadertoolsconfig.json @@ -0,0 +1,8 @@ +{ + "hlsl.preprocessorDefinitions": { + }, + " hlsl.additionalIncludeDirectories": [ + ], + "hlsl.virtualDirectoryMappings": { + } +}