示例#1
0
    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}.");
        }
    }
示例#2
0
    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);
    }
示例#3
0
    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");
        }
    }
示例#4
0
        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);
                    }
                }
            }
        }
示例#5
0
    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);
        }
    }
示例#6
0
 private static void Actor_UsedAct(object sender, UsedActEventArgs e)
 {
     Console.WriteLine($"{sender} Used act: {e.TacticalAct} Target: {e.Target}");
 }