private void ActorOnUsedAct(object sender, UsedActEventArgs e) { var actor = GetActorFromEventSender(sender); var actorHexNode = actor.Node as HexNode; var targetHexNode = e.Target.Node as HexNode; // Визуализируем удар. var actorViewModel = ActorViewModels.Single(x => x.Actor == actor); var actEffect = e.TacticalAct.Stats.Effect; switch (actEffect) { case TacticalActEffectType.Damage: ProcessDamage(e.Target, e.TacticalAct, actor, actorViewModel); break; case TacticalActEffectType.Heal: ProcessHeal(actorViewModel); break; case TacticalActEffectType.Undefined: default: throw new InvalidOperationException($"Неизвестный тип воздействия {actEffect}."); } }
private async void ActorOnUsedAct(object sender, UsedActEventArgs e) { await Task.Factory.StartNew(() => { var actor = GetActorFromEventSender(sender); var actorHexNode = actor.Node as HexNode; var targetHexNode = e.TargetNode as HexNode; // Визуализируем удар. var actorViewModel = ActorViewModels.Single(x => x.Actor == actor); var actEffect = e.TacticalAct.Stats.Effect; switch (actEffect) { case TacticalActEffectType.Damage: ProcessDamage(e.TargetNode, e.TacticalAct, actor, actorViewModel); break; case TacticalActEffectType.Heal: ProcessHeal(actorViewModel); break; case TacticalActEffectType.Undefined: default: throw new InvalidOperationException($"Неизвестный тип воздействия {actEffect}."); } }, CancellationToken.None, TaskCreationOptions.None, _taskScheduler); }
private void ActorOnUsedAct(object sender, UsedActEventArgs e) { var actor = GetActor(sender); var actorHexNode = actor.Node as HexNode; var targetHexNode = e.Target.Node as HexNode; // Визуализируем удар. var actorViewModel = _actorViewModels.Single(x => x.Actor == actor); if (e.TacticalAct.Stats.Effect == TacticalActEffectType.Damage) { var targetViewModel = _actorViewModels.Single(x => x.Actor == e.Target); actorViewModel.GraphicRoot.ProcessHit(targetViewModel.transform.position); var sfx = Instantiate(HitSfx, transform); targetViewModel.AddHitEffect(sfx); // Проверяем, стрелковое оружие или удар ближнего боя if (e.TacticalAct.Stats.Range?.Max > 1) { sfx.EffectSpriteRenderer.sprite = sfx.ShootSprite; // Создаём снараяд CreateBullet(actor, e.Target); } } else if (e.TacticalAct.Stats.Effect == TacticalActEffectType.Heal) { actorViewModel.GraphicRoot.ProcessHit(actorViewModel.transform.position); Debug.Log($"{actor} healed youself"); } }
private void Actor_UsedAct(object?sender, UsedActEventArgs e) { var stats = e.TacticalAct.Stats; if (stats is null) { throw new InvalidOperationException("The act has no stats to select visualization."); } Debug.WriteLine(e.TacticalAct); if (CanDraw) { if (stats.Effect == TacticalActEffectType.Damage && stats.IsMelee) { var serviceScope = ((LivGame)_game).ServiceProvider; var animationBlockerService = serviceScope.GetRequiredService <IAnimationBlockerService>(); var hexSize = MapMetrics.UnitSize / 2; var playerActorWorldCoords = HexHelper.ConvertToWorld(((HexNode)e.TargetNode).OffsetCoords); var newPosition = new Vector2( (float)(playerActorWorldCoords[0] * hexSize * Math.Sqrt(3)), playerActorWorldCoords[1] * hexSize * 2 / 2 ); var targetSpritePosition = newPosition; var attackSoundEffectInstance = GetSoundEffect(e.TacticalAct.Stats); _actorStateEngine = new ActorMeleeAttackEngine( _rootSprite, targetSpritePosition, animationBlockerService, attackSoundEffectInstance); // Selection actors only prevent error when monster stays on loot bag. var targetGameObject = _sectorViewModelContext.GameObjects.SingleOrDefault(x => x is IActorViewModel && x.Node == e.TargetNode); if (targetGameObject is null) { // This means the attacker is miss. // This situation can be then the target actor moved before the attack reaches the target. } else { var hitEffect = new HitEffect((LivGame)_game, targetSpritePosition + targetGameObject.HitEffectPosition, targetSpritePosition - _rootSprite.Position); _sectorViewModelContext.EffectManager.VisualEffects.Add(hitEffect); } } } }
private void ActorOnUsedAct(object sender, UsedActEventArgs e) { var actor = sender as IActor; if (actor == null) { throw new NotSupportedException("Не поддерживается обработка событий использования действия."); } var actorHexNode = actor.Node as HexNode; var targetHexNode = e.Target.Node as HexNode; var distance = actorHexNode.CubeCoords.DistanceTo(targetHexNode.CubeCoords); if (distance > 1) { // Создаём снараяд CreateBullet(actor, e.Target); } }
private static void Actor_UsedAct(object sender, UsedActEventArgs e) { Console.WriteLine($"{sender} Used act: {e.TacticalAct} Target: {e.Target}"); }