diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities.meta b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities.meta new file mode 100644 index 0000000..439cf52 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 47798a9b41024584bf29ffa69e9494cc +timeCreated: 1773387604 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/EntityConfigSO.cs b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/EntityConfigSO.cs new file mode 100644 index 0000000..8dfaf38 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/EntityConfigSO.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +namespace _Project.Develop.Runtime.Configs.Gameplay.Entities +{ + public abstract class EntityConfigSO : ScriptableObject + { + } +} diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/EntityConfigSO.cs.meta b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/EntityConfigSO.cs.meta new file mode 100644 index 0000000..5825adc --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/EntityConfigSO.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4dcd8eabefd749a8810f76f851e13888 +timeCreated: 1773387622 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/GhostConfigSO.cs b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/GhostConfigSO.cs new file mode 100644 index 0000000..449519e --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/GhostConfigSO.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +namespace _Project.Develop.Runtime.Configs.Gameplay.Entities +{ + [CreateAssetMenu(menuName = "Configs/Gameplay/Entities/NewGhostConfig", fileName = "GhostConfig")] + public class GhostConfigSO : EntityConfigSO + { + [field: SerializeField] public string PrefabPath { get; private set; } = "Entities/Ghost"; + [field: SerializeField, Min(0)] public float MoveSpeed { get; private set; } = 9; + [field: SerializeField, Min(0)] public float RotationSpeed { get; private set; } = 900; + [field: SerializeField, Min(0)] public float MaxHealth { get; private set; } = 100; + [field: SerializeField, Min(0)] public float BodyContactDamage { get; private set; } = 50; + [field: SerializeField, Min(0)] public float DeathProcessTime { get; private set; } = 2; + [field: SerializeField, Min(0)] public float SpawnProcessTime { get; private set; } = 2; + } +} diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/GhostConfigSO.cs.meta b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/GhostConfigSO.cs.meta new file mode 100644 index 0000000..356fba4 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/GhostConfigSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ad52b8e426e442d8a1f4646107c8abf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/HeroConfigSO.cs b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/HeroConfigSO.cs new file mode 100644 index 0000000..68ef8cf --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/HeroConfigSO.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace _Project.Develop.Runtime.Configs.Gameplay.Entities +{ + [CreateAssetMenu(menuName = "Configs/Gameplay/Entities/NewHeroConfig", fileName = "HeroConfig")] + public class HeroConfigSO : EntityConfigSO + { + [field: SerializeField] public string PrefabPath { get; private set; } = "Entities/Hero"; + [field: SerializeField, Min(0)] public float MoveSpeed { get; private set; } = 10; + [field: SerializeField, Min(0)] public float RotationSpeed { get; private set; } = 900; + [field: SerializeField, Min(0)] public float AttackProcessTime { get; private set; } = 1f; + [field: SerializeField, Min(0)] public float AttackDelayTime { get; private set; } = 0.1f; + [field: SerializeField, Min(0)] public float AttackCooldown { get; private set; } = 1f; + [field: SerializeField, Min(0)] public float InstantAttackDamage { get; private set; } = 50; + [field: SerializeField, Min(0)] public float MaxHealth { get; private set; } = 150; + [field: SerializeField, Min(0)] public float DeathProcessTime { get; private set; } = 2; + } +} diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/HeroConfigSO.cs.meta b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/HeroConfigSO.cs.meta new file mode 100644 index 0000000..f6fa33e --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/HeroConfigSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8df99bcd491f481c8c48d0d74110db7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/WizardConfigSO.cs b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/WizardConfigSO.cs new file mode 100644 index 0000000..0f64096 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/WizardConfigSO.cs @@ -0,0 +1,25 @@ +using UnityEngine; + +namespace _Project.Develop.Runtime.Configs.Gameplay.Entities +{ + [CreateAssetMenu(menuName = "Configs/Gameplay/Entities/NewWizardConfig", fileName = "WizardConfig")] + public class WizardConfigSO : EntityConfigSO + { + [field: SerializeField] public string PrefabPath { get; private set; } = "Entities/Wizard"; + [field: SerializeField, Min(0)] public float MoveSpeed { get; private set; } = 9; + [field: SerializeField, Min(0)] public float RotationSpeed { get; private set; } = 900; + [field: SerializeField, Min(0)] public float MaxHealth { get; private set; } = 100; + [field: SerializeField, Min(0)] public float TeleportDamage { get; private set; } = 50; + [field: SerializeField, Min(0)] public float TeleportDamageRadius { get; private set; } = 6; + [field: SerializeField, Min(0)] public int TeleportEnergyCast { get; private set; } = 50; + [field: SerializeField, Min(0)] public float TeleportSearchRadius { get; private set; } = 50; + [field: SerializeField, Min(0)] public float TeleportCooldownTime { get; private set; } = 3; + + [field: SerializeField, Min(0)] public int MaxEnergy { get; private set; } = 60; + [field: SerializeField, Min(0)] public int RegenEnergyAmount { get; private set; } = 10; + [field: SerializeField, Min(0)] public float AutoRegenEnergyTime { get; private set; } = 2; + + [field: SerializeField, Min(0)] public float DeathProcessTime { get; private set; } = 2; + [field: SerializeField, Min(0)] public float SpawnProcessTime { get; private set; } = 2; + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/WizardConfigSO.cs.meta b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/WizardConfigSO.cs.meta new file mode 100644 index 0000000..eb5525c --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Configs/Gameplay/Entities/WizardConfigSO.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0a272842ebd44ab92e7c414ba3371bd +timeCreated: 1773391238 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs b/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs index 99203ba..5ea917a 100644 --- a/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs +++ b/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using _Project.Develop.Runtime.Configs.Gameplay.Entities; using _Project.Develop.Runtime.Configs.Meta; using _Project.Develop.Runtime.UI.Common; using _Project.Develop.Runtime.UI.Features.LevelsMenuPopup; @@ -44,6 +45,9 @@ namespace Assets._Project.Develop.Runtime.Utilities.SceneManagement { { typeof(StartWalletConfigSO), "Configs/Meta/Wallet/StartWalletConfig" }, { typeof(CurrencyIconsConfigSO), "Configs/Meta/Wallet/CurrencyIconsConfig" }, + { typeof(HeroConfigSO), "Configs/Gameplay/Entities/HeroConfig" }, + { typeof(GhostConfigSO), "Configs/Gameplay/Entities/GhostConfig" }, + { typeof(WizardConfigSO), "Configs/Gameplay/Entities/WizardConfig" }, }; private static readonly Dictionary _uiPaths = new() diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs index a9ab03f..0e010b5 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs @@ -1,4 +1,5 @@ -using _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems; +using _Project.Develop.Runtime.Configs.Gameplay.Entities; +using _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems; using _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems.Shoot; using _Project.Develop.Runtime.Logic.Gameplay.Features.Damage; using _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems; @@ -30,7 +31,7 @@ namespace _Project.Develop.Runtime.Entities _monoEntitiesFactory = container.Resolve(); } - public Entity CreateHero(Vector3 position) + public Entity CreateHero(Vector3 position, HeroConfigSO config) { Entity entity = CreateEmpty(); @@ -39,31 +40,30 @@ namespace _Project.Develop.Runtime.Entities entity .AddMoveDirection() .AddRotateDirection() - .AddMoveSpeed(new ReactiveVariable(10)) - .AddRotationSpeed(new ReactiveVariable(800)) - .AddMaxHealth(new ReactiveVariable(150)) - .AddCurrentHealth(new ReactiveVariable(150)) + .AddMoveSpeed(new ReactiveVariable(config.MoveSpeed)) + .AddRotationSpeed(new ReactiveVariable(config.RotationSpeed)) + .AddMaxHealth(new ReactiveVariable(config.MaxHealth)) + .AddCurrentHealth(new ReactiveVariable(config.MaxHealth)) .AddTakeDamageRequest() .AddTakeDamageEvent() .AddIsDead() .AddIsMoving() .AddInDeathProcess() - .AddDeathProcessInitialTime(new ReactiveVariable(2)) + .AddDeathProcessInitialTime(new ReactiveVariable(config.DeathProcessTime)) .AddDeathProcessCurrentTime() - .AddAttackProcessInitialTime(new ReactiveVariable(1)) + .AddAttackProcessInitialTime(new ReactiveVariable(config.AttackProcessTime)) .AddAttackProcessCurrentTime() .AddInAttackProcess() .AddStartAttackRequest() .AddStartAttackEvent() .AddEndAttackEvent() - .AddAttackDelayTime(new ReactiveVariable(0.1f)) + .AddAttackDelayTime(new ReactiveVariable(config.AttackDelayTime)) .AddAttackDelayEndEvent() - .AddInstantAttackDamage(new ReactiveVariable(50)) + .AddInstantAttackDamage(new ReactiveVariable(config.InstantAttackDamage)) .AddAttackCanceledEvent() .AddAttackCooldownInitialTime() .AddAttackCooldownCurrentTime() - .AddInAttackCooldown() - .AddCurrentTarget(); + .AddInAttackCooldown(); ICompositeCondition canMove = new CompositeCondition() .Add(new FuncCondition(() => entity.IsDead.Value == false)); @@ -121,12 +121,10 @@ namespace _Project.Develop.Runtime.Entities .AddSystem(new DisableCollidersOnDeathSystem()) .AddSystem(new SelfReleaseSystem(_entitiesLifeContext)); - _entitiesLifeContext.Add(entity); - return entity; } - public Entity CreateGhost(Vector3 position) + public Entity CreateGhost(Vector3 position, GhostConfigSO config) { Entity entity = CreateEmpty(); @@ -138,17 +136,17 @@ namespace _Project.Develop.Runtime.Entities .AddContactEntitiesBuffer(new Buffer(64)) .AddMoveDirection() .AddRotateDirection() - .AddMoveSpeed(new ReactiveVariable(10)) - .AddRotationSpeed(new ReactiveVariable(800)) - .AddMaxHealth(new ReactiveVariable(50)) - .AddCurrentHealth(new ReactiveVariable(50)) - .AddBodyContactDamage(new ReactiveVariable(50)) + .AddMoveSpeed(new ReactiveVariable(config.MoveSpeed)) + .AddRotationSpeed(new ReactiveVariable(config.RotationSpeed)) + .AddMaxHealth(new ReactiveVariable(config.MaxHealth)) + .AddCurrentHealth(new ReactiveVariable(config.MaxHealth)) + .AddBodyContactDamage(new ReactiveVariable(config.BodyContactDamage)) .AddTakeDamageRequest() .AddTakeDamageEvent() .AddIsDead() .AddIsMoving() .AddInDeathProcess() - .AddDeathProcessInitialTime(new ReactiveVariable(2)) + .AddDeathProcessInitialTime(new ReactiveVariable(config.DeathProcessTime)) .AddDeathProcessCurrentTime(); ICompositeCondition canMove = new CompositeCondition() @@ -190,12 +188,10 @@ namespace _Project.Develop.Runtime.Entities .AddSystem(new DisableCollidersOnDeathSystem()) .AddSystem(new SelfReleaseSystem(_entitiesLifeContext)); - _entitiesLifeContext.Add(entity); - return entity; } - public Entity CreateTeleportWizard(Vector3 position) + public Entity CreateTeleportWizard(Vector3 position, WizardConfigSO config) { Entity entity = CreateEmpty(); @@ -206,8 +202,8 @@ namespace _Project.Develop.Runtime.Entities .AddContactCollidersBuffer(new Buffer(32)) .AddContactEntitiesBuffer(new Buffer(32)) - .AddMaxHealth(new ReactiveVariable(150)) - .AddCurrentHealth(new ReactiveVariable(150)) + .AddMaxHealth(new ReactiveVariable(config.MaxHealth)) + .AddCurrentHealth(new ReactiveVariable(config.MaxHealth)) .AddTeleportSource(entity.Transform) .AddTeleportToPoint(entity.Transform) @@ -219,34 +215,33 @@ namespace _Project.Develop.Runtime.Entities .AddEndTeleportEvent() .AddCurrentTarget() - .AddTeleportDamage(new ReactiveVariable(50)) - .AddTeleportDamageRadius(new ReactiveVariable(6)) + .AddTeleportDamage(new ReactiveVariable(config.TeleportDamage)) + .AddTeleportDamageRadius(new ReactiveVariable(config.TeleportDamageRadius)) .AddTeleportDamageMask(Layers.CharactersMask) - .AddTeleportEnergyCost(new ReactiveVariable(20)) - .AddTeleportSearchRadius(new ReactiveVariable(6)) + .AddTeleportEnergyCost(new ReactiveVariable(config.TeleportEnergyCast)) + .AddTeleportSearchRadius(new ReactiveVariable(config.TeleportSearchRadius)) - .AddTeleportCooldownInitialTime(new ReactiveVariable(3)) - .AddTeleportCooldownCurrentTime(new ReactiveVariable(3)) + .AddTeleportCooldownInitialTime(new ReactiveVariable(config.TeleportCooldownTime)) + .AddTeleportCooldownCurrentTime(new ReactiveVariable(config.TeleportCooldownTime)) .AddInTeleportCooldown(new ReactiveVariable(true)) - .AddCurrentEnergy(new ReactiveVariable(60)) - .AddMaxEnergy(new ReactiveVariable(60)) + .AddCurrentEnergy(new ReactiveVariable(config.MaxEnergy)) + .AddMaxEnergy(new ReactiveVariable(config.MaxEnergy)) .AddUseEnergyEvent() .AddUseEnergyRequest() .AddRegenEnergyEvent() .AddRegenEnergyRequest() - .AddAutoRegenEnergyAmount(new ReactiveVariable(10)) + .AddAutoRegenEnergyAmount(new ReactiveVariable(config.RegenEnergyAmount)) .AddIsAutoRegenEnergy(new ReactiveVariable(true)) .AddEnergyAutoRegenCurrentTime() - .AddEnergyAutoRegenInitialTime(new ReactiveVariable(3)) - - .AddBodyContactDamage(new ReactiveVariable(50)) + .AddEnergyAutoRegenInitialTime(new ReactiveVariable(config.AutoRegenEnergyTime)) + .AddTakeDamageRequest() .AddTakeDamageEvent() .AddIsDead() .AddInDeathProcess() - .AddDeathProcessInitialTime(new ReactiveVariable(2)) + .AddDeathProcessInitialTime(new ReactiveVariable(config.DeathProcessTime)) .AddDeathProcessCurrentTime(); ICompositeCondition canRegenEnergy = new CompositeCondition() @@ -298,7 +293,7 @@ namespace _Project.Develop.Runtime.Entities .AddSystem(new BodyContactsDetectingSystem()) .AddSystem(new BodyContactsEntitiesFilterSystem(_collidersRegistryService)) - .AddSystem(new DealDamageOnContactSystem()) + // .AddSystem(new DealDamageOnContactSystem()) .AddSystem(new ApplyDamageSystem()) .AddSystem(new DeathSwitcherSystem()) @@ -307,8 +302,6 @@ namespace _Project.Develop.Runtime.Entities .AddSystem(new DisableCollidersOnDeathSystem()) .AddSystem(new SelfReleaseSystem(_entitiesLifeContext)); - _entitiesLifeContext.Add(entity); - return entity; } diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs index 9e19832..6058959 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs @@ -466,6 +466,30 @@ namespace _Project.Develop.Runtime.Entities return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Teleport.TeleportDamageMask() {Value = value}); } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Team TeamC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Team>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<_Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Teams> Team => TeamC.Value; + + public bool TryGetTeam(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<_Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Teams> value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Team component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<_Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Teams>); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddTeam() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Team() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<_Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Teams>() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddTeam(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<_Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Teams> value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Teams.Team() {Value = value}); + } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Sensors.CapsuleColliderComponent CapsuleColliderC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Sensors.CapsuleColliderComponent>(); public UnityEngine.CapsuleCollider CapsuleCollider => CapsuleColliderC.Value; @@ -810,6 +834,13 @@ namespace _Project.Develop.Runtime.Entities return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanJump() {Value = value}); } + public _Project.Develop.Runtime.Logic.Gameplay.Features.MainHero.IsMainHero IsMainHeroC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.MainHero.IsMainHero>(); + + public _Project.Develop.Runtime.Entities.Entity AddIsMainHero() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.MainHero.IsMainHero() ); + } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.CurrentHealth CurrentHealthC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.CurrentHealth>(); public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable CurrentHealth => CurrentHealthC.Value; diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies.meta new file mode 100644 index 0000000..071c56e --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 073e06f2bd1243408c61652926dbac9a +timeCreated: 1773390931 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies/EnemiesFactory.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies/EnemiesFactory.cs new file mode 100644 index 0000000..6137b13 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies/EnemiesFactory.cs @@ -0,0 +1,52 @@ +using System; +using _Project.Develop.Runtime.Configs.Gameplay.Entities; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Logic.Gameplay.Features.AI; +using _Project.Develop.Runtime.Logic.Gameplay.Features.Selectors; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using Assets._Project.Develop.Runtime.Infrastructure.DI; +using UnityEngine; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Enemies +{ + public class EnemiesFactory + { + private readonly EntitiesFactory _entitiesFactory; + private readonly BrainsFactory _brainsFactory; + private readonly EntitiesLifeContext _entitiesLifeContext; + + public EnemiesFactory(DIContainer container) + { + _entitiesFactory = container.Resolve(); + _brainsFactory = container.Resolve(); + _entitiesLifeContext = container.Resolve(); + } + + public Entity Create(Vector3 position, EntityConfigSO config) + { + Entity entity; + + switch (config) + { + case GhostConfigSO ghostConfig: + entity = _entitiesFactory.CreateGhost(position, ghostConfig); + _brainsFactory.CreateGhostBrain(entity); + break; + + case WizardConfigSO wizardConfig: + entity = _entitiesFactory.CreateTeleportWizard(position, wizardConfig); + _brainsFactory.CreateDangerWizardBrain(entity, new LowestHealthTargetSelector(entity)); + break; + + default: + throw new ArgumentException($"Not support {config.GetType()} type config"); + } + + entity.AddTeam(new ReactiveVariable(Teams.Teams.Enemies)); + + _entitiesLifeContext.Add(entity); + + return entity; + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies/EnemiesFactory.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies/EnemiesFactory.cs.meta new file mode 100644 index 0000000..b403eb7 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Enemies/EnemiesFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 51102a09ab584bd8a413995baf3ed9b9 +timeCreated: 1773390941 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero.meta new file mode 100644 index 0000000..633058b --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3bfebd749d5b44a295ddf91039d598a4 +timeCreated: 1773389854 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroComponents.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroComponents.cs new file mode 100644 index 0000000..31a0fd7 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroComponents.cs @@ -0,0 +1,6 @@ +using _Project.Develop.Runtime.Entities; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.MainHero +{ + public class IsMainHero : IEntityComponent { } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroComponents.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroComponents.cs.meta new file mode 100644 index 0000000..2997d95 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroComponents.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1d7f214ebbb94ba3a40b05d47a56ea32 +timeCreated: 1773389869 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroFactory.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroFactory.cs new file mode 100644 index 0000000..98c104c --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroFactory.cs @@ -0,0 +1,44 @@ +using _Project.Develop.Runtime.Configs.Gameplay.Entities; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Logic.Gameplay.Features.AI; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using Assets._Project.Develop.Runtime.Infrastructure.DI; +using Assets._Project.Develop.Runtime.Utilities.ConfigsManagement; +using UnityEngine; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.MainHero +{ + public class MainHeroFactory + { + private readonly EntitiesFactory _entitiesFactory; + private readonly BrainsFactory _brainsFactory; + private readonly ConfigsProviderService _configLoader; + private readonly EntitiesLifeContext _entitiesLifeContext; + + public MainHeroFactory(DIContainer container) + { + _entitiesFactory = container.Resolve(); + _brainsFactory = container.Resolve(); + _configLoader = container.Resolve(); + _entitiesLifeContext = container.Resolve(); + } + + public Entity Create(Vector3 position) + { + HeroConfigSO config = _configLoader.GetConfig(); + + Entity entity = _entitiesFactory.CreateHero(position, config); + + entity + .AddIsMainHero() + .AddTeam(new ReactiveVariable(Teams.Teams.MainHero)); + + entity.AddCurrentTarget(); + _brainsFactory.CreateMainHeroBrain(entity); + + _entitiesLifeContext.Add(entity); + + return entity; + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroFactory.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroFactory.cs.meta new file mode 100644 index 0000000..f9ff7fb --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/MainHero/MainHeroFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f02ea9aeb6334badac37cab0a5e69da0 +timeCreated: 1773390441 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams.meta new file mode 100644 index 0000000..bf72852 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2bf870f1fd6247d7aaa3343f010cfd52 +timeCreated: 1773394525 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/Teams.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/Teams.cs new file mode 100644 index 0000000..7435367 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/Teams.cs @@ -0,0 +1,8 @@ +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Teams +{ + public enum Teams + { + MainHero, + Enemies + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/Teams.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/Teams.cs.meta new file mode 100644 index 0000000..d209350 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/Teams.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b5919366f522d048bcde4e406462f16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/TeamsComponents.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/TeamsComponents.cs new file mode 100644 index 0000000..9fa39bc --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/TeamsComponents.cs @@ -0,0 +1,10 @@ +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utils.ReactiveManagement; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Teams +{ + public class Team : IEntityComponent + { + public ReactiveVariable Value; + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/TeamsComponents.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/TeamsComponents.cs.meta new file mode 100644 index 0000000..8de8e79 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Teams/TeamsComponents.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2d8073d07bb648c5b6e3dc920591e9db +timeCreated: 1773394552 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/GameplayContextRegistrations.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/GameplayContextRegistrations.cs index df3500b..ebc1999 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/GameplayContextRegistrations.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/GameplayContextRegistrations.cs @@ -1,5 +1,7 @@ using _Project.Develop.Runtime.Entities; using _Project.Develop.Runtime.Logic.Gameplay.Features.AI; +using _Project.Develop.Runtime.Logic.Gameplay.Features.Enemies; +using _Project.Develop.Runtime.Logic.Gameplay.Features.MainHero; using _Project.Develop.Runtime.UI; using _Project.Develop.Runtime.UI.Core; using _Project.Develop.Runtime.UI.Screens.Gameplay; @@ -25,12 +27,17 @@ namespace Assets._Project.Develop.Runtime.Gameplay.Infrastructure container.RegisterAsSingle(CreateAIBrainContext); container.RegisterAsSingle(CreateBrainsFactory); container.RegisterAsSingle(CreateMonoEntitiesFactory).NonLazy(); + container.RegisterAsSingle(CreateMainHeroFactory); + container.RegisterAsSingle(CreateEnemiesFactory); } private static AIBrainsContext CreateAIBrainContext(DIContainer c) => new(); private static BrainsFactory CreateBrainsFactory(DIContainer c) => new(c); private static EntitiesLifeContext CreateEntitiesLifeContext(DIContainer c) => new(); + private static EnemiesFactory CreateEnemiesFactory(DIContainer c) => new (c); + private static MainHeroFactory CreateMainHeroFactory(DIContainer c) => new (c); + private static EntitiesFactory CreateEntitiesFactory(DIContainer c) => new(c); private static GameplayPresentersFactory CreateGameplayPresentersFactory(DIContainer c) => new(c); diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs index b7d7a6d..119ddad 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs @@ -1,9 +1,14 @@ using System; +using _Project.Develop.Runtime.Configs.Gameplay.Entities; using _Project.Develop.Runtime.Entities; using _Project.Develop.Runtime.Logic.Gameplay.Features.AI; +using _Project.Develop.Runtime.Logic.Gameplay.Features.Enemies; +using _Project.Develop.Runtime.Logic.Gameplay.Features.MainHero; using _Project.Develop.Runtime.Logic.Gameplay.Features.Selectors; using _Project.Develop.Runtime.Utils.InputManagement; using Assets._Project.Develop.Runtime.Infrastructure.DI; +using Assets._Project.Develop.Runtime.Utilities.AssetsManagement; +using Assets._Project.Develop.Runtime.Utilities.ConfigsManagement; using UnityEngine; namespace _Project.Develop.Runtime.Logic.Gameplay.Features @@ -11,7 +16,8 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features public class TestGameplay : MonoBehaviour { private DIContainer _container; - private EntitiesFactory _entitiesFactory; + private EnemiesFactory _enemiesFactory; + private MainHeroFactory _mainHeroFactory; private BrainsFactory _brainsFactory; private Entity _hero; @@ -24,14 +30,15 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features _container = container; _container.Resolve().Enable(); - _entitiesFactory = _container.Resolve(); + + _enemiesFactory = _container.Resolve(); + _mainHeroFactory = _container.Resolve(); _brainsFactory = _container.Resolve(); - _hero = _entitiesFactory.CreateHero(Vector3.zero); - _brainsFactory.CreateMainHeroBrain(_hero); - - _enemy = _entitiesFactory.CreateTeleportWizard(Vector3.zero + Vector3.forward * 5); - _brainsFactory.CreateDangerWizardBrain(_enemy, new LowestHealthTargetSelector(_enemy)); + _hero = _mainHeroFactory.Create(Vector3.zero); + _enemy = _enemiesFactory.Create( + Vector3.zero + Vector3.forward * 5, + _container.Resolve().GetConfig()); } public void Run() diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities.meta b/Assets/_Project/Resources/Configs/Gameplay/Entities.meta new file mode 100644 index 0000000..7ab5d33 --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc56c1fb94541f1438fa6474b69863f8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities/GhostConfig.asset b/Assets/_Project/Resources/Configs/Gameplay/Entities/GhostConfig.asset new file mode 100644 index 0000000..402780e --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities/GhostConfig.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2ad52b8e426e442d8a1f4646107c8abf, type: 3} + m_Name: GhostConfig + m_EditorClassIdentifier: + k__BackingField: Entities/Ghost + k__BackingField: 9 + k__BackingField: 900 + k__BackingField: 100 + k__BackingField: 50 + k__BackingField: 2 + k__BackingField: 2 diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities/GhostConfig.asset.meta b/Assets/_Project/Resources/Configs/Gameplay/Entities/GhostConfig.asset.meta new file mode 100644 index 0000000..641e053 --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities/GhostConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c8d883f310a9bf54dbb319d1fbb73bb6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities/HeroConfig.asset b/Assets/_Project/Resources/Configs/Gameplay/Entities/HeroConfig.asset new file mode 100644 index 0000000..6c90d4c --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities/HeroConfig.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8df99bcd491f481c8c48d0d74110db7a, type: 3} + m_Name: HeroConfig + m_EditorClassIdentifier: + k__BackingField: Entities/Hero + k__BackingField: 10 + k__BackingField: 900 + k__BackingField: 1 + k__BackingField: 0.1 + k__BackingField: 1 + k__BackingField: 50 + k__BackingField: 150 + k__BackingField: 2 diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities/HeroConfig.asset.meta b/Assets/_Project/Resources/Configs/Gameplay/Entities/HeroConfig.asset.meta new file mode 100644 index 0000000..af9a75f --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities/HeroConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b3771ea520252a4387be141615738d2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities/WizardConfig.asset b/Assets/_Project/Resources/Configs/Gameplay/Entities/WizardConfig.asset new file mode 100644 index 0000000..b8003d5 --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities/WizardConfig.asset @@ -0,0 +1,28 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0a272842ebd44ab92e7c414ba3371bd, type: 3} + m_Name: WizardConfig + m_EditorClassIdentifier: + k__BackingField: Entities/Wizard + k__BackingField: 9 + k__BackingField: 900 + k__BackingField: 100 + k__BackingField: 50 + k__BackingField: 6 + k__BackingField: 50 + k__BackingField: 50 + k__BackingField: 3 + k__BackingField: 60 + k__BackingField: 10 + k__BackingField: 2 + k__BackingField: 2 + k__BackingField: 2 diff --git a/Assets/_Project/Resources/Configs/Gameplay/Entities/WizardConfig.asset.meta b/Assets/_Project/Resources/Configs/Gameplay/Entities/WizardConfig.asset.meta new file mode 100644 index 0000000..bcd0d50 --- /dev/null +++ b/Assets/_Project/Resources/Configs/Gameplay/Entities/WizardConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 08a5a589bbbbb2d4da29f807a8696040 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: