Exemple #1
0
 public async Task UpdateShowsWithActDescription(string actGuid, ActDescription actDescription)
 {
     await elasticClient.UpdateByQueryAsync <ShowDocument>(ubq => ubq
                                                           .Query(q => q
                                                                  .Bool(b => b
                                                                        .Must(m => m
                                                                              .Match(m => m
                                                                                     .Field(f => f.ActGuid)
                                                                                     .Query(actGuid)
                                                                                     )
                                                                              )
                                                                        .Must(m => m
                                                                              .DateRange(dr => dr
                                                                                         .Field(f => f.ActDescription.ModifiedDate)
                                                                                         .LessThan(actDescription.ModifiedDate)
                                                                                         )
                                                                              )
                                                                        )
                                                                  )
                                                           .Script(s => s
                                                                   .Source("ctx._source.actDescription = params.actDescription")
                                                                   .Params(p => p
                                                                           .Add("actDescription", actDescription)
                                                                           )
                                                                   )
                                                           .Conflicts(Conflicts.Proceed)
                                                           .Refresh(true)
                                                           );
 }
        private IVisualEffect?GetAttackVisualEffect(IGraphNode targetNode, Vector2 targetSpritePosition,
                                                    ActDescription usedActDescription)
        {
            // Selection actors only is prevention of a error when a monster stays on a loot bag.
            var actorViewModels  = _sectorViewModelContext.GameObjects.Where(x => x is IActorViewModel);
            var targetGameObject = actorViewModels.SingleOrDefault(x => x.Node == targetNode);

            if (targetGameObject is null)
            {
                // This means the attacker missed.
                // This situation can be then the target actor moved before the attack reaches the target.
                return(null);
            }

            var difference        = targetSpritePosition - _rootSprite.Position;
            var hitEffectPosition = (difference / 2) + _rootSprite.Position + HitEffectPosition;
            var direction         = difference;

            direction.Normalize();

            var hitEffect = new HitEffect(this, targetGameObject, _gameObjectVisualizationContentStorage,
                                          hitEffectPosition, direction, usedActDescription);

            _sectorViewModelContext.EffectManager.VisualEffects.Add(hitEffect);

            return(hitEffect);
        }
        public void RunCombatActUsageAnimation(ActDescription usedActDescription, IGraphNode targetNode)
        {
            if (!CanDraw)
            {
                return;
            }

            var serviceScope = ((LivGame)_game).ServiceProvider;

            var animationBlockerService = serviceScope.GetRequiredService <IAnimationBlockerService>();

            var hexSize = MapMetrics.UnitSize / 2;
            var playerActorWorldCoords = HexHelper.ConvertToWorld(((HexNode)targetNode).OffsetCoords);
            var newPosition            = new Vector2(
                (float)(playerActorWorldCoords[0] * hexSize * Math.Sqrt(3)),
                playerActorWorldCoords[1] * hexSize * 2 / 2
                );

            var targetSpritePosition = newPosition;

            var attackSoundEffectInstance = GetAttackSoundEffect(usedActDescription);
            var hitVisualEffect           = GetAttackVisualEffect(targetNode, targetSpritePosition, usedActDescription);

            var stateEngine = new ActorMeleeAttackEngine(
                _rootSprite,
                targetSpritePosition,
                animationBlockerService,
                attackSoundEffectInstance,
                hitVisualEffect);

            AddStateEngine(stateEngine);
        }
 public DamageActorInteractionEvent(IActor actor, IActor targetActor, ActDescription usedActDescription,
                                    DamageEfficientCalc damageEfficientCalcResult) : base(actor)
 {
     TargetActor               = targetActor ?? throw new ArgumentNullException(nameof(targetActor));
     UsedActDescription        = usedActDescription;
     DamageEfficientCalcResult = damageEfficientCalcResult;
 }
        private SoundEffectInstance?GetAttackSoundEffect(ActDescription usedActDescription)
        {
            var attackSoundEffect = _personSoundStorage.GetActStartSound(usedActDescription);

            var attackSoundEffectInstance = attackSoundEffect?.CreateInstance();

            return(attackSoundEffectInstance);
        }
 public Task UpdateShowsWithActDescription(string actGuid, ActDescription actDescription)
 {
     foreach (var show in shows.Where(s => s.ActGuid == actGuid))
     {
         show.ActDescription = DeepCopy(actDescription);
     }
     return(Task.CompletedTask);
 }
 public DodgeActorInteractionEvent(IActor actor, IActor targetActor, PersonDefenceItem personDefenceItem,
                                   ActDescription usedActDescription) :
     base(actor)
 {
     TargetActor        = targetActor ?? throw new ArgumentNullException(nameof(targetActor));
     PersonDefenceItem  = personDefenceItem ?? throw new ArgumentNullException(nameof(personDefenceItem));
     UsedActDescription = usedActDescription;
 }
Exemple #8
0
        private SoundEffectInstance?GetSoundEffect(ITacticalActStatsSubScheme actStatScheme)
        {
            var usedActDescription = ActDescription.CreateFromActStats(actStatScheme);

            var attackSoundEffect = _personSoundStorage.GetActStartSound(usedActDescription);

            var attackSoundEffectInstance = attackSoundEffect?.CreateInstance();

            return(attackSoundEffectInstance);
        }
        public async Task Handle(ShowAdded showAdded)
        {
            Console.WriteLine($"Indexing a show for {showAdded.act.description.title} at {showAdded.venue.description.name}.");
            try
            {
                string actGuid   = showAdded.act.actGuid.ToString().ToLower();
                string venueGuid = showAdded.venue.venueGuid.ToString().ToLower();

                ActDescription   actDescription   = ActDescription.FromRepresentation(showAdded.act.description);
                VenueDescription venueDescription = VenueDescription.FromRepresentation(showAdded.venue.description);
                VenueLocation    venueLocation    = VenueLocation.FromRepresentation(showAdded.venue.location);

                ActDocument act = await actUpdater.UpdateAndGetLatestAct(new ActDocument
                {
                    ActGuid     = actGuid,
                    Description = actDescription
                });

                VenueDocument venue = await venueUpdater.UpdateAndGetLatestVenue(new VenueDocument
                {
                    VenueGuid   = venueGuid,
                    Description = venueDescription,
                    Location    = venueLocation
                });

                var show = new ShowDocument
                {
                    ActGuid          = actGuid,
                    VenueGuid        = venueGuid,
                    StartTime        = showAdded.show.startTime,
                    ActDescription   = act.Description,
                    VenueDescription = venue.Description,
                    VenueLocation    = venue.Location
                };
                await repository.IndexShow(show);

                Console.WriteLine("Succeeded");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }
Exemple #10
0
        private static HitEffectTypes GetHitType(ActDescription usedActDescription)
        {
            foreach (var tag in usedActDescription.Tags)
            {
                switch (tag)
                {
                case "slash": return(HitEffectTypes.ShortBlade);

                case "bite": return(HitEffectTypes.Teeth);

                case "punch": return(HitEffectTypes.Punch);
                }
            }

            Debug.Fail("Hit effect was not found to visualize combat action.");

            // Show default hit effect.
            return(HitEffectTypes.ShortBlade);
        }
Exemple #11
0
        public HitEffect(
            GameObjectBase attacker,
            GameObjectBase target,
            IGameObjectVisualizationContentStorage contentStorage,
            Vector2 effectPosition,
            Vector2 direction,
            ActDescription usedActDescription)
        {
            var hitType      = GetHitType(usedActDescription);
            var hitDirection = GetHitDirection(direction);

            var hitTexture = contentStorage.GetHitEffectTexture(hitType, hitDirection);

            _hitSprite = new Sprite(hitTexture)
            {
                Position        = effectPosition,
                Origin          = new Vector2(0.5f, 0.5f),
                Color           = new Color(255, 255, 255, 0.0f),
                SourceRectangle = new Rectangle(0, 0, FRAME_WIDTH, FRAME_HEIGHT)
            };

            var hitBackingTexture = contentStorage.GetHitEffectTexture(hitType | HitEffectTypes.Backing,
                                                                       HitEffectDirections.Left);

            _hitBackingSprite = new Sprite(hitBackingTexture)
            {
                Position        = effectPosition,
                Origin          = new Vector2(0.5f, 0.5f),
                Color           = new Color(255, 255, 255, 0.0f),
                SourceRectangle = new Rectangle(0, 0, FRAME_WIDTH, FRAME_HEIGHT)
            };

            if (direction.X > 0)
            {
                _hitSprite.FlipX        = true;
                _hitBackingSprite.FlipX = true;
            }

            _animationCounter     = EFFECT_DISPLAY_DURATION_SECONDS;
            _postAnimationCounter = EFFECT_DELAY_DURATION_SECONDS;

            _boundGameObjects = new[] { attacker, target };
        }
        /// <inheritdoc />
        public SoundEffect GetActStartSound(ActDescription actDescription)
        {
            if (_actStartDict is null)
            {
                throw new InvalidOperationException(
                          "Dictionary of act sound effect must be initialized in storage loading.");
            }

            foreach (var tag in actDescription.Tags)
            {
                if (_actStartDict.TryGetValue(tag, out var soundEffect))
                {
                    return(soundEffect);
                }
            }

            Debug.Fail("All acts must have audio effect.");
            // Return default audio if act is unknown.
            return(_defaultStartHitEffect ?? throw new InvalidOperationException("All content must be loaded early."));
        }
        public async Task Handle(ActDescriptionChanged actDescriptionChanged)
        {
            Console.WriteLine($"Updating index for act {actDescriptionChanged.description.title}.");
            try
            {
                string         actGuid        = actDescriptionChanged.actGuid.ToString().ToLower();
                ActDescription actDescription = ActDescription.FromRepresentation(actDescriptionChanged.description);
                ActDocument    act            = await actUpdater.UpdateAndGetLatestAct(new ActDocument
                {
                    ActGuid     = actGuid,
                    Description = actDescription
                });

                await repository.UpdateShowsWithActDescription(actGuid, act.Description);

                Console.WriteLine("Succeeded");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }
 /// <inheritdoc />
 public SoundEffect GetActHitSound(ActDescription actDescription, IPerson targetPerson)
 {
     return(_swordHitEffect ?? throw new InvalidOperationException("All content must be loaded early."));
 }
Exemple #15
0
 public PureMissActorInteractionEvent(IActor actor, IActor targetActor, ActDescription usedActDescription) :
     base(actor)
 {
     TargetActor        = targetActor ?? throw new ArgumentNullException(nameof(targetActor));
     UsedActDescription = usedActDescription;
 }