private IBehaviourTreeNode UnacquaintedTree(IActorStateModel actor)
 {
     // @formatter:off
     return(new BehaviourTreeBuilder()
            .Sequence()
            .Condition(t => IsEntityState(actor, EntityState.Unacquainted))
            .Parallel(1, 1)
            .Sequence()
            .Do(UnacquaintedTimeout())
            .Do(LeaveScreen())
            .Do(Deactivate())
            .End()
            .Selector()
            .Sequence()
            .Do(FirstTouch())
            .End()
            .Sequence()
            .Do(FollowAvatar())
            .Do(Move())
            .End()
            .Sequence()
            .Do(WanderTimeout())
            .Do(Wander())
            .Do(Move())
            .Do(ResetTimeout(TimeoutDataComponent.Storage.WanderTimeout))
            .End()
            .End()  // END Top Selector
            .End()  // END Parallel
            .End()  // END Top Sequence
            .Build());
     // @formatter:on
 }
Пример #2
0
 public ResetTimeoutNode(
     IActorStateModel actorStateModel,
     TimeoutDataComponent.Storage storage)
 {
     _storage = storage;
     _timeoutDataComponent = actorStateModel.Get <TimeoutDataComponent>();
 }
        private float GetDistanceSquared(IActorStateModel actorA, IActorStateModel actorB)
        {
            var distance = actorA.Get <TransformDataComponent>().Position -
                           actorB.Get <TransformDataComponent>().Position;

            return(distance.sqrMagnitude);
        }
        public EntityFacade(
            IMonoEntity entity,
            IActorStateModel actor,
            IPauseStateModel pauseStateModel)
        {
            Entity                     = entity;
            Actor                      = actor;
            _pauseStateModel           = pauseStateModel;
            _entityLifecycleDisposable = new SerialDisposable().AddTo(Disposer);

            Entity.Setup(Actor);

            Actor.Get <TransformDataComponent>()
            .SetMonoEntity(Entity);

            HealthDataComponent = Actor.Get <HealthDataComponent>();

            HealthDataComponent.IsAlive
            .DelayFrame(1)
            .Subscribe(OnIsAliveChanged)
            .AddTo(Disposer);

            Observable.EveryUpdate()
            .Where(_ => CanTick)
            .Subscribe(_ => OnTick())
            .AddTo(Disposer);
        }
Пример #5
0
 public MoveNode(
     IActorStateModel actorStateModel,
     AiMovementController aiMovementController)
 {
     _aiMovementController = aiMovementController;
     _blackBoard           = actorStateModel.Get <BlackBoardDataComponent>();
 }
Пример #6
0
 private void TryRemoveAsAvatar(IActorStateModel actor)
 {
     if (actor.Get <EntityTypeDataComponent>().EntityType == EntityType.Avatar)
     {
         Avatar = null;
     }
 }
Пример #7
0
 private void TryAddAsAvatar(IActorStateModel actor)
 {
     if (actor.Get <EntityTypeDataComponent>().EntityType == EntityType.Avatar)
     {
         Avatar = actor;
     }
 }
 public SwitchEntityStateNode(
     IActorStateModel actorStateModel,
     EntityState targetState)
 {
     _relationshipDataComponent = actorStateModel.Get <RelationshipDataComponent>();
     _targetState = targetState;
 }
 public AvatarFacade(
     IMonoEntity entity,
     IActorStateModel actor,
     IPauseStateModel pauseStateModel)
     : base(entity, actor, pauseStateModel)
 {
 }
Пример #10
0
 public void Add(IActorStateModel actor)
 {
     if (!_knownEntities.Contains(actor))
     {
         _knownEntities.Add(actor);
         TryAddAsAvatar(actor);
     }
 }
Пример #11
0
 public void Remove(IActorStateModel actor)
 {
     if (_knownEntities.Contains(actor))
     {
         _knownEntities.Remove(actor);
         TryRemoveAsAvatar(actor);
     }
 }
 public FollowAvatarNode(IActorStateModel actorStateModel)
 {
     _actorStateModel        = actorStateModel;
     _blackBoard             = _actorStateModel.Get <BlackBoardDataComponent>();
     _sensorDataComponent    = _actorStateModel.Get <SensorDataComponent>();
     _transformDataComponent = _actorStateModel.Get <TransformDataComponent>();
     _timeoutDataComponent   = _actorStateModel.Get <TimeoutDataComponent>();
 }
        public FirstTouchNode(
            IActorStateModel actorStateModel,
            BehaviourTreeConfig behaviourTreeConfig)
        {
            _behaviourTreeConfig = behaviourTreeConfig;

            _sensorDataComponent       = actorStateModel.Get <SensorDataComponent>();
            _relationshipDataComponent = actorStateModel.Get <RelationshipDataComponent>();
        }
Пример #14
0
 public IdleTimeoutNode(
     IActorStateModel actor,
     double timeoutSeconds,
     TimeoutDataComponent.Storage storage)
 {
     _timeoutDataComponent = actor.Get <TimeoutDataComponent>();
     _timeoutSeconds       = timeoutSeconds;
     _storage = storage;
 }
        public void Remove(IActorStateModel actor, SensorType sensor)
        {
            _storages[sensor].Remove(actor);

            if (_lifetimeSubscriptions.ContainsKey(actor))
            {
                _lifetimeSubscriptions[actor].Dispose();
                _lifetimeSubscriptions.Remove(actor);
            }
        }
        public EnterScreenNode(
            IActorStateModel actorStateModel,
            AiMovementController aiMovementController,
            ScreenSizeModel screenSizeModel)
        {
            _aiMovementController = aiMovementController;
            _screenSizeModel      = screenSizeModel;

            _originDataComponent    = actorStateModel.Get <OriginDataComponent>();
            _transformDataComponent = actorStateModel.Get <TransformDataComponent>();
        }
Пример #17
0
 public IdleTimeoutRandomNode(
     IActorStateModel actor,
     double timeoutSeconds,
     TimeoutDataComponent.Storage storage,
     double randomChance)
 {
     _timeoutDataComponent = actor.Get <TimeoutDataComponent>();
     _timeoutSeconds       = timeoutSeconds;
     _storage      = storage;
     _randomChance = randomChance;
 }
Пример #18
0
        public EntityStateNotificationSystem(IActorStateModel actor)
            : base(actor)
        {
            _relationshipDataComponent = actor.Get <RelationshipDataComponent>();

            _components = actor.GetAll <IEntityStateSensitiveDataComponent>();

            _relationshipDataComponent.Relationship
            .Subscribe(OnRelationShipChanged)
            .AddTo(Disposer);
        }
        public void Setup(IActorStateModel actor)
        {
            if (_isSetup)
            {
                return;
            }
            _isSetup = true;

            Actor = actor;

            OnSetup();
        }
Пример #20
0
 public WanderNode(
     IActorStateModel actorStateModel,
     IRandomNumberService randomNumberService,
     ScreenSizeModel screenSizeModel)
 {
     _randomNumberService    = randomNumberService;
     _screenSizeModel        = screenSizeModel;
     _blackBoard             = actorStateModel.Get <BlackBoardDataComponent>();
     _originDataComponent    = actorStateModel.Get <OriginDataComponent>();
     _wanderDataComponent    = actorStateModel.Get <WanderDataComponent>();
     _transformDataComponent = actorStateModel.Get <TransformDataComponent>();
 }
        public void Add(IActorStateModel actor, SensorType sensor)
        {
            _storages[sensor].Add(actor);

            if (!_lifetimeSubscriptions.ContainsKey(actor))
            {
                var sub = actor.Get <HealthDataComponent>().IsAlive
                          .IfFalse()
                          .Subscribe(_ => Remove(actor, sensor))
                          .AddTo(Disposer);

                _lifetimeSubscriptions.Add(actor, sub);
            }
        }
 private IBehaviourTreeNode NeutralTree(IActorStateModel actor)
 {
     // @formatter:off
     return(new BehaviourTreeBuilder()
            .Sequence()
            .Condition(t => IsEntityState(actor, EntityState.Neutral))
            .Sequence()
            .Do(NeutralTimeout())
            .Do(LeaveScreen())
            .Do(Deactivate())
            .End()
            .End()
            .Build());
     // @formatter:on
 }
 private IBehaviourTreeNode SpawningTree(IActorStateModel actor)
 {
     // @formatter:off
     return(new BehaviourTreeBuilder()
            .Sequence()
            .Condition(t => IsEntityState(actor, EntityState.Spawning))
            .Sequence()
            .Do(LightSwitch())
            .Do(EnterScreen())
            .Do(SwitchStateTo(EntityState.Unacquainted))
            .End()
            .End()
            .Build());
     // @formatter:on
 }
Пример #24
0
        public InputMovementController(
            IActorStateModel actorStateModel,
            VirtualJoystickModel virtualJoystickModel,
            UserInputConfig userInputConfig,
            IPauseStateModel pauseStateModel)
            : base(actorStateModel)
        {
            _virtualJoystickModel = virtualJoystickModel;
            _userInputConfig      = userInputConfig;
            _pauseStateModel      = pauseStateModel;

            Observable.EveryUpdate()
            .Subscribe(_ => OnUpdate())
            .AddTo(Disposer);
        }
        public void Initialize()
        {
            AvatarActor = _avatarActorFactory.CreateAvatar();

            var avatarEntity = _entityFactory.Create(
                _actorEntitiesConfig.AvatarPrefab);

            _avatarFacadeFactory.Create(
                avatarEntity,
                AvatarActor);

            _userInputControllerFactory
            .Create(AvatarActor);

            _isAvatarSpawned.Value = true;
        }
Пример #26
0
        public void Setup(IActorStateModel actorStateModel)
        {
            if (_isSetup)
            {
                return;
            }
            _isSetup = true;

            Actor = actorStateModel;

            _components = GetComponents <IMonoComponent>();
            _components?.ForEach(e => e.Setup(Actor));

            _tickableComponents = _components?
                                  .OfType <ITickableMonoComponent>()
                                  .ToArray();
        }
        public NovatarFacade(
            IMonoEntity entity,
            IActorStateModel actor,
            BehaviourTree behaviourTree,
            IPauseStateModel pauseStateModel)
            : base(entity, actor, pauseStateModel)
        {
            _behaviourTree             = behaviourTree;
            _originDataComponent       = Actor.Get <OriginDataComponent>();
            _relationshipDataComponent = Actor.Get <RelationshipDataComponent>();

            _resettableNodes = _behaviourTree.Nodes
                               .OfType <IResettableNode>()
                               .ToList();

            _originDataComponent.SpawnPosition
            .Subscribe(Entity.SetPosition)
            .AddTo(Disposer);
        }
 private IBehaviourTreeNode EnemyTree(IActorStateModel actor)
 {
     // @formatter:off
     return(new BehaviourTreeBuilder()
            .Sequence()
            .Condition(t => IsEntityState(actor, EntityState.Enemy))
            .Selector()
            .Sequence()
            .Do(FindDamageReceiver())
            .Do(Damage())
            .End()
            .Sequence()
            .Do(EnemyTimeout())
            .Do(LeaveScreen())
            .Do(Deactivate())
            .End()
            .End()
            .End()
            .Build());
     // @formatter:on
 }
        public BehaviourTree Create(
            IActorStateModel actor,
            AiMovementController aiMovementController)
        {
            _actorStateModel      = actor;
            _aiMovementController = aiMovementController;
            _generatedNodes       = new List <IBehaviourTreeNode>();

            // @formatter:off
            var startNode = new BehaviourTreeBuilder()
                            .Selector()
                            .Splice(SpawningTree(actor))
                            .Splice(UnacquaintedTree(actor))
                            .Splice(NeutralTree(actor))
                            .Splice(FriendTree(actor))
                            .Splice(EnemyTree(actor))
                            .End()
                            .Build();

            // @formatter:on

            return(new BehaviourTree(startNode, _generatedNodes.ToArray()));
        }
 private IBehaviourTreeNode FriendTree(IActorStateModel actor)
 {
     // @formatter:off
     return(new BehaviourTreeBuilder()
            .Sequence()
            .Condition(t => IsEntityState(actor, EntityState.Friend))
            .Selector()
            .Sequence()
            .Do(NearDeath())
            .Do(SwitchStateTo(EntityState.Neutral))
            .End()
            .Sequence()
            .Do(FollowAvatarBoid())
            .Do(Move())
            .End()
            .Sequence()
            .Do(FriendTimeout())
            .Do(SwitchStateTo(EntityState.Neutral))
            .End()
            .End()
            .End()
            .Build());
     // @formatter:on
 }