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; }
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; }
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); }
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 } }
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); }
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(); }
public override float Heuristic(Element element, Piece launcher, SkillArea area) { return(0); }
public override Task Apply(Element element, Piece launcher, SkillArea area) { CommonApply(element, launcher, area, false); return(Task.FromResult <object>(null)); }
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](); }
void Start() { Trigers[0].gameObject.SetActive(false); Trigers[1].gameObject.SetActive(false); SkillAreaParam = GetComponent <SkillArea>(); }