public SkillCoverTypeHelper(SkillCoverType type) { _type = type; }
/// <summary> /// 获取技能覆盖范围 /// </summary> /// <param name="covertype"></param> /// <param name="tx"></param> /// <param name="ty"></param> /// <param name="sx"></param> /// <param name="sy"></param> /// <param name="coversize"></param> /// <returns></returns> public List <BattleBlockVector> GetSkillCoverBlocks(SkillCoverType covertype, int tx, int ty, int sx, int sy, int coversize) { var rst = new List <BattleBlockVector>(); switch (covertype) { //点攻击,只有一个格子 case SkillCoverType.POINT: rst.Add(new BattleBlockVector() { X = tx, Y = ty }); break; case SkillCoverType.FAN: { MoveDirection direction = GetDirection(tx, ty, sx, sy); if (direction == MoveDirection.ERROR) { break; } rst.Add(new BattleBlockVector() { X = tx, Y = ty }); if (direction == MoveDirection.UP_LEFT) { rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); } else if (direction == MoveDirection.UP_RIGHT) { rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); } else if (direction == MoveDirection.RIGHT) { rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); } else if (direction == MoveDirection.DOWN_RIGHT) { rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); } else if (direction == MoveDirection.DOWN_LEFT) { rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); } else if (direction == MoveDirection.LEFT) { rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); } break; } case SkillCoverType.FACE: rst.Add(new BattleBlockVector() { X = tx, Y = ty }); rst.AddRange(GetNearBlocks(tx, ty, coversize)); break; case SkillCoverType.LINE: { if (coversize == 0) { coversize = 1; //修正直线攻击没有攻击覆盖的BUG } int tmpx = sx; int tmpy = sy; MoveDirection direction = GetDirection(tx, ty, sx, sy); if (direction == MoveDirection.ERROR) { break; } for (int i = 0; i < coversize; ++i) { BattleBlockVector b = GetNearBlock(tmpx, tmpy, direction); if (b == null) { continue; } rst.Add(b); tmpx = b.X; tmpy = b.Y; } break; } case SkillCoverType.FRONT: { MoveDirection direction = GetDirection(tx, ty, sx, sy); if (direction == MoveDirection.ERROR) { break; } rst.Add(new BattleBlockVector() { X = tx, Y = ty }); if (direction == MoveDirection.UP_LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_RIGHT)); } else if (direction == MoveDirection.UP_RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.RIGHT)); } else if (direction == MoveDirection.RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_RIGHT)); } else if (direction == MoveDirection.DOWN_RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_LEFT)); } else if (direction == MoveDirection.DOWN_LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.LEFT)); } else if (direction == MoveDirection.LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_LEFT)); } break; } case SkillCoverType.FRONTCROSS: { MoveDirection direction = GetDirection(tx, ty, sx, sy); if (direction == MoveDirection.ERROR) { break; } rst.Add(new BattleBlockVector() { X = tx, Y = ty }); if (direction == MoveDirection.UP_LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); } else if (direction == MoveDirection.UP_RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); } else if (direction == MoveDirection.RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); } else if (direction == MoveDirection.DOWN_RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); } else if (direction == MoveDirection.DOWN_LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); } else if (direction == MoveDirection.LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); } break; } case SkillCoverType.FANGSHE: //放射 { rst.Add(new BattleBlockVector() { X = tx, Y = ty }); var roundblocks = GetNearBlocks(tx, ty, 1); rst.AddRange(roundblocks); foreach (var b in roundblocks) { MoveDirection direction = GetDirection(b.X, b.Y, sx, sy); if (direction == MoveDirection.ERROR) { continue; } var block = GetNearBlock(b.X, b.Y, direction); if (block == null) { continue; } rst.Add(block); } break; } case SkillCoverType.STAR: { rst.Add(new BattleBlockVector() { X = tx, Y = ty }); for (int i = 0; i < 6; ++i) { int tmpx = tx; int tmpy = ty; MoveDirection direction = (MoveDirection)i; for (int j = 0; j < coversize; ++j) { BattleBlockVector b = GetNearBlock(tmpx, tmpy, direction); if (b == null) { continue; } rst.Add(b); tmpx = b.X; tmpy = b.Y; } } break; } case SkillCoverType.ZHUIXING: { MoveDirection direction = GetDirection(tx, ty, sx, sy); if (direction == MoveDirection.ERROR) { break; } rst.Add(new BattleBlockVector() { X = tx, Y = ty }); if (direction == MoveDirection.UP_LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT, MoveDirection.UP_RIGHT)); } else if (direction == MoveDirection.UP_RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT, MoveDirection.RIGHT)); } else if (direction == MoveDirection.RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT, MoveDirection.UP_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT, MoveDirection.DOWN_RIGHT)); } else if (direction == MoveDirection.DOWN_RIGHT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT, MoveDirection.RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT, MoveDirection.DOWN_LEFT)); } else if (direction == MoveDirection.DOWN_LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT, MoveDirection.DOWN_RIGHT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT, MoveDirection.LEFT)); } else if (direction == MoveDirection.LEFT) { rst.Add(GetNearBlock(sx, sy, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(sx, sy, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.UP_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT, MoveDirection.DOWN_LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT, MoveDirection.LEFT)); rst.Add(GetNearBlock(tx, ty, MoveDirection.LEFT, MoveDirection.UP_LEFT)); } break; } default: throw new ArgumentOutOfRangeException(nameof(covertype), covertype, null); } return(rst); }