private BoardBall GetEstimatedBoardBall(GameEntity ballEntity, Vector3 hitPos) { BoardBall res = new BoardBall(); res.boardIdx = ballEntity.boardBall.boardIdx; bool upHit = hitPos.y > ballEntity.gameObject.gameobject.transform.position.y; bool rightHit = hitPos.x > ballEntity.gameObject.gameobject.transform.position.x; if (upHit) { res.boardIdx.x += rightHit ? 1 : -1; res.shifted = ballEntity.boardBall.shifted; } else { res.shifted = !ballEntity.boardBall.shifted; res.boardIdx.y++; if (ballEntity.boardBall.shifted) { res.boardIdx.x += rightHit ? 1 : 0; } else { res.boardIdx.x += rightHit ? 0 : -1; } } if (res.boardIdx.x == -1 || res.boardIdx.y == -1 || res.boardIdx.x > 5) { res.boardIdx = Vector2.one * -1; } return(res); }
public static List <GameEntity> GetChildrenFor(GameEntity[,] boardEntities, BoardBall b) { List <GameEntity> children = new List <GameEntity>(); List <Vector2> childrenIdxs = b.shifted ? neighborsOfShited : neighborsOfNotShited; childrenIdxs = childrenIdxs.GetRange(4, 2); foreach (Vector2 v in childrenIdxs) { int x = (int)(b.boardIdx.x + v.x); int y = (int)(b.boardIdx.y + v.y); if (y < 0 || y >= BoardManager.length || x < 0 || x >= BoardManager.width) { continue; } if (boardEntities[x, y] != null) { children.Add(boardEntities[x, y]); } } return(children); }
public static List <GameEntity> GetSiblingsFor(GameEntity[,] boardEntities, BoardBall b) { List <GameEntity> siblings = new List <GameEntity>(); List <Vector2> siblingsIdxs = b.shifted ? neighborsOfShited : neighborsOfNotShited; siblingsIdxs = siblingsIdxs.GetRange(2, 2); foreach (Vector2 v in siblingsIdxs) { int x = (int)(b.boardIdx.x + v.x); int y = (int)(b.boardIdx.y + v.y); if (y < 0 || y >= BoardManager.length || x < 0 || x >= BoardManager.width) { continue; } if (boardEntities[x, y] != null) { siblings.Add(boardEntities[x, y]); } } return(siblings); }
private static List <GameEntity> GetCluster(GameEntity[,] boardEntities, Vector2 boardIdx, int val = -1) { HashSet <GameEntity> visited = new HashSet <GameEntity>(); Queue <Vector2> toVisit = new Queue <Vector2>(); toVisit.Enqueue(boardIdx); while (toVisit.Count > 0) { GameEntity currEntity = GetEntity(boardEntities, toVisit.Peek()); toVisit.Dequeue(); BoardBall curr = currEntity.boardBall; if (visited.Contains(currEntity)) { continue; } visited.Add(currEntity); var neighborsList = curr.shifted ? neighborsOfShited : neighborsOfNotShited; foreach (Vector2 v in neighborsList) { Vector2 neighborIdx = curr.boardIdx + v; if (Mathf.Min(neighborIdx.x, neighborIdx.y) < 0 || neighborIdx.x >= BoardManager.width || neighborIdx.y >= BoardManager.length) { continue; } GameEntity neighborEntity = GetEntity(boardEntities, neighborIdx); if (neighborEntity == null) { continue; } if (val != -1 && neighborEntity.boardBall.value != val) { continue; } if (toVisit.Contains(neighborIdx)) { continue; } toVisit.Enqueue(neighborIdx); } } return(visited.ToList()); }
protected override void Execute(List <InputEntity> entities) { if (gameContext.GetGroup(GameMatcher.Moving).GetEntities().Length > 0) { return; } if (ballEntitiesGroup.GetEntities().Length == 0) { return; } Vector3 start, end, dir; RaycastHit2D hit; linePositions.Clear(); ballTargets.Clear(); InputEntity click = entities[0]; start = GameplayManager.Instance.PrimaryBallPosition.position; end = click.mousePressed.position; dir = (end - start).normalized; linePositions.Add(start); hit = Physics2D.Raycast(start, dir); if (hit.collider && hit.collider.CompareTag("Border")) { start += dir * hit.distance * 0.98f; linePositions.Add(start); ballTargets.Add(start); dir.x *= -1; estimatedBall.transform.position = -10 * Vector3.one; } ballEntity = ballEntitiesGroup.GetEntities()[0]; hit = Physics2D.Raycast(start, dir); if (hit.collider && hit.collider.CompareTag("Ball")) { end = hit.point; linePositions.Add(end); GameEntity collidedBallEntity = hit.collider.gameObject.GetEntityLink().entity as GameEntity; BoardBall tmp = GetEstimatedBoardBall(collidedBallEntity, end); ballEntity.boardBall.boardIdx = tmp.boardIdx; ballEntity.boardBall.shifted = tmp.shifted; end = GameUtils.WorldPosForBall(ballEntity); estimatedBall.transform.position = end; linePositions.Add(end); ballTargets.Add(end); } else if (hit.collider && hit.collider.CompareTag("Ceil")) { end = hit.point; linePositions.Add(end); bool isShiftedRow = GameUtils.IsRowShifted(0); float hShift = end.x - GameplayManager.Instance.ZeroPosition.x + (isShiftedRow ? 0 : 0.5f * GameplayManager.Instance.cellWidth); Vector2 idx = new Vector2((int)(hShift / GameplayManager.Instance.cellWidth), 0); Debug.Log(isShiftedRow + " | " + hShift); ballEntity.boardBall.boardIdx = idx; ballEntity.boardBall.shifted = isShiftedRow; end = GameUtils.WorldPosForBall(ballEntity); estimatedBall.transform.position = end; linePositions.Add(end); ballTargets.Add(end); } else { linePositions.Clear(); ballTargets.Clear(); UpdateAimLine(); return; } ballEntity.ReplaceTargetPositions(GameplayManager.Instance.ballFiringSpeed, ballTargets); UpdateAimLine(); }
protected override void Execute(List <GameEntity> entities) { BoardBall primaryBall = entities[0].boardBall; lineMaterial.SetColor("_Color", GameplayManager.Instance.ColorsDic.colors[primaryBall.value]); }