Exemple #1
0
    public async Task Apply(Piece launcher, SkillArea overideArea = null)
    {
        await effect.Apply(element, launcher, overideArea ?? area.Done());

        condition.Used();
        return;
    }
 // Use this for initialization
 void Start()
 {
     camera     = GetComponent <Camera>();
     layerMask  = ~layerMask;
     state      = 0;
     pattern    = SkillArea.NONE;
     effectarea = 0;
 }
        public bool CreateArea(SkillArea area)
        {
            if (area.ID != 0)
                return false;

            foreach (var a in context.SkillAreas)
            {
                if (a.AreaName == area.AreaName)
                    return false;
            }

            context.SkillAreas.Add(area);
            context.SaveChanges();
            return true;
        }
Exemple #4
0
 public Skill(int cost, int cooldown, List <Effect> effects, SkillType skillType, string skillName, int rangeMin, int rangeMax, SkillEffect skilleffect = SkillEffect.NONE, SkillArea skillarea = SkillArea.NONE, int effectarea = 0)
 {
     Cost               = cost;
     Cooldown           = cooldown;
     tourCooldownLeft   = 0;
     this.effects       = effects;
     SkillName          = skillName;
     this.AbilitySprite = Resources.Load <Sprite>("UI_Images/Abilities/" + SkillName);
     SkillType          = skillType;
     this.maxRange      = rangeMax;
     this.minRange      = rangeMin;
     EffectArea         = effectarea;
     SkillArea          = skillarea;
     SkillEffect        = skilleffect;
 }
Exemple #5
0
        private float CommonApply(Element element, Piece launcher, SkillArea area, bool simulate = false)
        {
            float heuristic = 0f;

            foreach (Piece piece in area.AllPieces())
            {
                if (noFriendlyFire && piece.entity.alignment == launcher.entity.alignment)
                {
                    continue;
                }
                float modifier = 1f;
                switch (piece.entity.affinity[element])
                {
                case (ElementAffinity.IMMUNE):
                    modifier = 0f;
                    break;

                case (ElementAffinity.RESISTANT):
                    modifier = 0.5f;
                    break;

                case (ElementAffinity.WEAK):
                    modifier = 2f;
                    break;
                }
                float final_floating_damage = modifier * damage;
                final_floating_damage += launcher.entity.GetMod(Modifier.BONUS_DAMAGE);
                final_floating_damage -= piece.entity.GetMod(Modifier.ARMOR);
                int final_damage = (int)Math.Max(0, Math.Ceiling(final_floating_damage));
                if (simulate)
                {
                    int h = piece.entity.ModifyHealthSimulation(-final_damage);
                    heuristic += (piece.entity.alignment == launcher.entity.alignment) ? 2 * h : -h;
                }
                else
                {
                    piece.entity.ModifyHealth(-final_damage);
                    Visual.Effects.FloatingLabel.CreateDamage(piece, -final_damage);
                }
            }
            return(heuristic);
        }
Exemple #6
0
        public override async Task Apply(Element element, Piece launcher, SkillArea area)
        {
            int   totalTiles = area.Count;
            float stepTime   = totalTiles switch
            {
                0 => 0.4f,
                1 => 0.4f,
                2 => 0.4f,
                3 => 0.3f,
                4 => 0.25f,
                5 => 0.2f,
                _ => 0.15f,
            };

            foreach (Tile tile in area.AllTiles().Skip(1))
            {
                await launcher.WalkTo(tile, stepTime);

                launcher.MoveOn(tile);
                // TODO: activate effects on landing tile
            }
        }
Exemple #7
0
        private float CommonApply(Element element, Piece launcher, SkillArea area, bool simulate)
        {
            float heuristic = 0f;

            foreach (Piece piece in area.AllPieces())
            {
                if (piece.entity.alignment != launcher.entity.alignment)
                {
                    continue;
                }
                float modifier = 1f;
                switch (piece.entity.affinity[element])
                {
                case (ElementAffinity.RESISTANT):
                    modifier = 2f;
                    break;

                default:
                    modifier = 1f;
                    break;
                }
                float final_floating_heal = modifier * heal;
                int   final_healing       = (int)final_floating_heal;
                if (simulate)
                {
                    int h = piece.entity.ModifyHealthSimulation(final_healing);
                    heuristic += (piece.entity.alignment == launcher.entity.alignment) ? h : -h;
                }
                else
                {
                    piece.entity.ModifyHealth(final_healing);
                    Visual.Effects.FloatingLabel.CreateHealing(piece, final_healing);
                }
            }
            return(heuristic);
        }
Exemple #8
0
    public async void Play()
    {
        await Task.Delay(1000);

        Skill walking = actor.GetMoveSkills().FirstOrDefault();

        if (walking != null && walking.area is Snake snake)
        {
            var reachableTiles = BoardUtils.AllReachableTiles(piece.on, maxLength: snake.maxRange, valid: CanStepOn);
            // TODO: Think
            var pair = reachableTiles.ToList().Random();
            if (pair.Key != piece.on)
            {
                SkillArea a = new SkillArea();
                a.AddRange(pair.Value);
                await SkillHandler.WALK.Apply(piece, a);
            }
        }

        var       skills        = actor.GetCoreSkills();
        float     bestHeuristic = 0;
        Skill     bestSkill     = null;
        SkillArea bestArea      = null;

        foreach (Skill skill in skills)
        {
            if (!skill.condition.IsValid())
            {
                continue;
            }
            // Try Cone
            skill.area.launcher = piece;
            if (skill.area is Cone cone)
            {
                foreach (Direction dir in DirectionUtils.DIRECTIONS)
                {
                    SkillArea area      = cone.SkillAreaIfTarget(dir);
                    float     heuristic = skill.effect.Heuristic(skill.element, piece, area);
                    if (heuristic > bestHeuristic)
                    {
                        bestHeuristic = heuristic;
                        bestArea      = area;
                        bestSkill     = skill;
                    }
                }
            }
            // Try Target
            else if (skill.area is Target target)
            {
                foreach (Tile tile in BoardUtils.AllTiles(t => target.CanSelect(t)))
                {
                    SkillArea area      = target.SkillAreaIfTarget(tile);
                    float     heuristic = skill.effect.Heuristic(skill.element, piece, area);
                    if (heuristic > bestHeuristic)
                    {
                        bestHeuristic = heuristic;
                        bestArea      = area;
                        bestSkill     = skill;
                    }
                }
            }
        }
        if (bestSkill != null)
        {
            await bestSkill.Apply(piece, bestArea);
        }
        Global.battle.NextTurn();
    }
Exemple #9
0
 public override float Heuristic(Element element, Piece launcher, SkillArea area)
 {
     return(0);
 }
Exemple #10
0
 public override Task Apply(Element element, Piece launcher, SkillArea area)
 {
     CommonApply(element, launcher, area, false);
     return(Task.FromResult <object>(null));
 }
Exemple #11
0
 public override float Heuristic(Element element, Piece launcher, SkillArea area)
 {
     return(CommonApply(element, launcher, area, true));
 }
 private static List<Skill> CreateSkills(SkillArea skillArea)
 {
     return createPredefinedSkills[skillArea]();
 }
Exemple #13
0
 void Start()
 {
     Trigers[0].gameObject.SetActive(false);
     Trigers[1].gameObject.SetActive(false);
     SkillAreaParam = GetComponent <SkillArea>();
 }