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; }
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; } }
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); }
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.")); }
public PureMissActorInteractionEvent(IActor actor, IActor targetActor, ActDescription usedActDescription) : base(actor) { TargetActor = targetActor ?? throw new ArgumentNullException(nameof(targetActor)); UsedActDescription = usedActDescription; }