コード例 #1
0
ファイル: CombatResolver.cs プロジェクト: Zodiannok/Beneath
    private void ResolveExecuteEvent(CombatSkillExecuter executer)
    {
        Skill userSkill = executer.ExecutedSkill;

        // Execute effects on all targets.
        if (userSkill != null && userSkill.SkillDefinition.Effect != null)
        {
            CombatEventDispatcher dispatcher = new CombatEventDispatcher(this);
            CombatUnit            userUnit   = executer.Owner;

            foreach (CombatUnit target in executer.Targets)
            {
                CombatEventLog log = new CombatEventLog(userSkill);
                log.LogValues.Add("user", userUnit.Unit.Profile.Name);
                log.LogValues.Add("target", target.Unit.Profile.Name);
                log.LogValues.Add("skillname", userSkill.SkillDefinition.DisplayedName);

                userSkill.SkillDefinition.Effect.Apply(dispatcher, userUnit, target, log);
                _CombatEventLog.Add(log);
            }

            // Trigger execute event after skill usage.
            CombatEvent executeEvent = new CombatEvent(executer, CombatEventType.Apply, userUnit);
            HandleCombatEvent(executeEvent);
        }
    }
コード例 #2
0
ファイル: CombatResolver.cs プロジェクト: Zodiannok/Beneath
    private void ResolveDeclareEvent(CombatSkillExecuter executer)
    {
        Skill      userSkill = executer.ExecutedSkill;
        CombatUnit user      = executer.Owner;

        // Check if the skill can be used (user is alive, skill is not used up, etc.)
        if (user == null || user.CombatStatus.SkillUsed)
        {
            executer.Interrupt();
        }
        else if (user.Unit == null || user.Unit.IsDead)
        {
            executer.Interrupt();
        }
        else if (userSkill == null || userSkill.SkillCurrentUsage == 0)
        {
            executer.Interrupt();
        }

        if (!executer.IsInterrupted)
        {
            executer.GenerateSkillTargets();

            // If we don't have valid targets, then this skill will not be triggered.
            if (executer.Targets.Count == 0)
            {
                executer.Interrupt();
            }
        }

        if (!executer.IsInterrupted)
        {
            // The skill is now triggered. Decrement skill usage times right now.
            // If another reaction skill cancels this skill, the skill will still be consumed.
            --userSkill.SkillCurrentUsage;
            user.CombatStatus.SkillUsed = true;

            // Check if any reactions are triggered.
            // Reactions may modify declareEvent, causing the attempt to use this skill to fail.
            // If this happens, the IsValid field on the event shall also be set to false.

            // React to declare event first.
            CombatEvent declareEvent = new CombatEvent(executer, CombatEventType.Declare, user);
            HandleCombatEvent(declareEvent);

            // Then react to targeting event for each target, if the skill execution is still valid.
            if (!executer.IsInterrupted)
            {
                foreach (CombatUnit targetUnit in executer.Targets)
                {
                    CombatEvent targetingEvent = new CombatEvent(executer, CombatEventType.Target, targetUnit);
                    HandleCombatEvent(targetingEvent);
                }
            }
        }
    }
コード例 #3
0
ファイル: CombatResolver.cs プロジェクト: Zodiannok/Beneath
    private void ResolveSkill(CombatUnit skillOwner)
    {
        CombatSkillExecuter executer = new CombatSkillExecuter(this, skillOwner);

        ResolveDeclareEvent(executer);

        // If the combat event is still valid, execute the event.
        if (!executer.IsInterrupted)
        {
            ResolveExecuteEvent(executer);
        }
    }
コード例 #4
0
ファイル: CombatResolver.cs プロジェクト: Zodiannok/Beneath
    public CombatEvent(CombatSkillExecuter triggeringSkillExecutor, CombatEventType eventType, CombatUnit eventTarget)
    {
        CombatResolver resolver = triggeringSkillExecutor.Resolver;

        Executer = triggeringSkillExecutor;

        Skill = triggeringSkillExecutor.ExecutedSkill;
        User  = triggeringSkillExecutor.Owner;

        Party  = User.CombatParty;
        Phase  = Skill.SkillDefinition.PerformedPhase;
        Event  = eventType;
        Target = eventTarget;
    }