private void laserStep(laserNode node) // Need to add: if strength <= 0 return { // Get data from node int x = node.getX(), y = node.getY(), indx = node.getIndex(), subIndx = node.getSubIndex(); float strength = node.getStrength(); Direction heading = node.getHeading(), direction = node.getMarchDir(); Player player = node.getOwner(); // Check if valid iteration if (x < 0 || y < 0 || x >= gridManager.theGrid.getDimX() || y >= gridManager.theGrid.getDimY() || iterationCount > iterationLimit) { return; } iterationCount++; // Check if opposing laser if (laserData.checkOpposing(x, y, heading, direction)) { return; } // Make sure lasers list is initialized while (lasers.Count <= laserIndex) { lasers.Add(new List <laserNode>()); } // Check if on same path as existing laser int[] indeces = laserData.checkOverlapping(x, y, strength, heading, direction, player); if (indeces != null) { lasers[indeces[0]][indeces[1]] = new laserNode(x, y, lasers[indeces[0]][indeces[1]].getStrength() + strength, heading, direction, Player.Shared, indx, subIndx); } else { // Add node to list for line rendering later laserData.insertNode(x, y, strength, heading, direction, player, indx, subIndx); lasers[indx].Add(new laserNode(x, y, strength, heading, direction, player, indx, subIndx)); } // Determine next laser step int newX; int newY; Direction newDir; float newStrength = strength - laserDecay; switch (heading) { case Direction.NE: { if (direction == Direction.Right) { newDir = Direction.Up; newX = x; newY = y + 1; } else { newDir = Direction.Right; newX = x + 1; newY = y; } laserSolver(newX, newY, newStrength, heading, newDir, player, indx, subIndx); break; } case Direction.NW: { if (direction == Direction.Left) { newDir = Direction.Up; newX = x; newY = y + 1; } else { newDir = Direction.Left; newX = x - 1; newY = y; } laserSolver(newX, newY, newStrength, heading, newDir, player, indx, subIndx); break; } case Direction.SE: { if (direction == Direction.Right) { newDir = Direction.Down; newX = x; newY = y - 1; } else { newDir = Direction.Right; newX = x + 1; newY = y; } laserSolver(newX, newY, newStrength, heading, newDir, player, indx, subIndx); break; } case Direction.SW: { if (direction == Direction.Left) { newDir = Direction.Down; newX = x; newY = y - 1; } else { newDir = Direction.Left; newX = x - 1; newY = y; } laserSolver(newX, newY, newStrength, heading, newDir, player, indx, subIndx); break; } } }
private void drawLaser(laserNode start, laserNode end) { Vector3 startPos = coordToPos(start.getX(), start.getY(), start.getHeading(), start.getMarchDir(), true); Vector3 endPos = coordToPos(end.getX(), end.getY(), end.getHeading(), end.getMarchDir(), false); laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().SetPosition(0, startPos); laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().SetPosition(1, endPos); laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().enabled = true; laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().startColor = new Color(1, 1, 1, start.getStrength() * laserIntensity); laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().endColor = new Color(1, 1, 1, end.getStrength() * laserIntensity); if (start.getOwner() == Player.Shared) { laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().material = laserMaterialCombined; } else { laserContainer.transform.GetChild(laserCounter).GetComponent <LineRenderer>().material = start.getOwner() == Player.PlayerOne ? laserMaterialP1 : laserMaterialP2; } laserCounter++; }