bekovski

sg_workingCpyFinalAlmost

Jun 3rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 19.98 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. using System.Text.RegularExpressions;
  6.  
  7. public class LevelManager : MonoBehaviour {
  8.  
  9.     // singleton
  10.     public static LevelManager instance;
  11.  
  12.     // file prefix
  13.     private readonly string prefix = "Assets/Levels/";
  14.  
  15.     // player prefab
  16.     public Transform pacman;
  17.  
  18.     // player coods
  19.     int pacmanX;
  20.     int pacmanZ;
  21.  
  22.     // enemy prefabs
  23.     public Transform blinky;
  24.     public Transform pinky;
  25.     public Transform inky;
  26.     public Transform clyde;
  27.  
  28.     // enemy coords
  29.     int blinkyX;
  30.     int blinkyZ;
  31.     int pinkyX;
  32.     int pinkyZ;
  33.     int inkyX;
  34.     int inkyZ;
  35.     int clydeX;
  36.     int clydeZ;
  37.  
  38.     // tiles
  39.     public Transform corridor;
  40.     public Transform corner;
  41.     public Transform cross;
  42.     public Transform tCross;
  43.     public Transform deadEnd;
  44.  
  45.     // corresponding strings
  46.     readonly char sCorridorHorizontal = '-';
  47.     readonly char sCorridorVertical = '|';
  48.     readonly char sCross = '+';             // could be cross or tCross or corner
  49.  
  50.     // the level as a string
  51.     private List<string> level = new List<string> ();
  52.     private bool isReady;
  53.  
  54.     // a struct that helps setting the wayPoints
  55.     struct WayPointData {
  56.         public Transform tile;
  57.         public bool goUp;
  58.         public bool goDown;
  59.         public bool goLeft;
  60.         public bool goRight;
  61.     };
  62.     WayPointData[,] wayPointDataArray;  // 2D array
  63.     int rows = 0;                       // final # of rows
  64.     int cols = -1;                      // final # of columns
  65.     int r = 0;                          // row idx  (needed when filling in the array)
  66.     int c = 0;                          // col idx  (needed when filling in the array)
  67.  
  68.     // instantiated objects
  69.     List<Transform> createdTiles = new List<Transform>();
  70.     List<Transform> createdCharacters = new List<Transform>();
  71.  
  72.     void Awake() {
  73.         instance = this;
  74.     }
  75.  
  76.     void Update() {
  77.         if(isReady) {
  78.             wayPointDataArray = new WayPointData[rows, cols];
  79.             CreateLevel ();
  80.             SetWayPoints ();
  81.             SetAndInstantiateCharacters ();
  82.             isReady = false;
  83.         }
  84.     }
  85.  
  86.     /// <summary>
  87.     /// Reads the file. In doing so, it also destroys the current level and creates the data necessary for the new level.
  88.     /// While reading the file, syntax and semantic checks are done as well.
  89.     /// </summary>
  90.     /// <param name="fileName">File name.</param>
  91.     public void ReadFile(string fileName) {
  92.         Destroy ();
  93.         Reset ();
  94.  
  95.         string text = System.IO.File.ReadAllText (prefix + fileName);
  96.  
  97.         if(!SyntaxChecker.instance.IsSyntacticallyCorrect (text)) {
  98.             SyntaxChecker.instance.errorMsg.text = "Syntax Error!";
  99.             return;
  100.         }
  101.  
  102.         List<string> lines = new List<string>(Regex.Split (text, "\n"));
  103.  
  104.         for(int i=0; i < lines.Count; ++i) {
  105.             string currentLine = lines[i].Trim();
  106.             string[] currentLineSplit = Regex.Split (currentLine, " ");
  107.  
  108.             // important note #1: we have to invert the provided z-value as the level grows downward but the z-axis points upward
  109.             // important note #2: the x-value is to be used in the 2nd dimension of the level-array (-> columns!)
  110.             // important note #3: as the z-value will be negative, we have to invert it again when accessing the level-array later on
  111.  
  112.             switch(currentLineSplit[0]) {
  113.             case "Pacman":
  114.                 pacmanX = int.Parse (currentLineSplit [1]);
  115.                 pacmanZ = -int.Parse (currentLineSplit [2]);
  116.                 break;
  117.             case "Blinky":
  118.                 blinkyX = int.Parse (currentLineSplit [1]);
  119.                 blinkyZ = -int.Parse (currentLineSplit [2]);
  120.                 break;
  121.             case "Pinky":
  122.                 pinkyX = int.Parse (currentLineSplit [1]);
  123.                 pinkyZ = -int.Parse (currentLineSplit [2]);
  124.                 break;
  125.             case "Inky":
  126.                 inkyX = int.Parse (currentLineSplit [1]);
  127.                 inkyZ = -int.Parse (currentLineSplit [2]);
  128.                 break;
  129.             case "Clyde":
  130.                 clydeX = int.Parse (currentLineSplit [1]);
  131.                 clydeZ = -int.Parse (currentLineSplit [2]);
  132.                 break;
  133.             default:
  134.                 // else it must be some level object
  135.                 level.Add (currentLine);
  136.                 rows++;
  137.                 if(cols == -1) {
  138.                     // assumes that each row is of the same length
  139.                     cols = currentLine.Length;
  140.                 }
  141.                 break;
  142.             } // switch()
  143.         } // for()
  144.            
  145.         if(!SemanticsChecker.instance.IsSemanticallyCorrect (lines, rows, cols)) {
  146.             SemanticsChecker.instance.errorMsg.text = "Semantics Error!";
  147.             return;
  148.         }
  149.  
  150.         isReady = true;
  151.     } // ReadFile()
  152.        
  153.  
  154.     /// <summary>
  155.     /// Destroys the level and the characters.
  156.     /// </summary>
  157.     void Destroy() {
  158.         foreach(Transform character in createdCharacters) {
  159.             if(character != null) {
  160.                 Destroy (character.gameObject);
  161.             }
  162.         }
  163.  
  164.         foreach(Transform tile in createdTiles) {
  165.             if(tile != null) {
  166.                 Destroy (tile.gameObject);
  167.             }
  168.         }
  169.  
  170.         createdCharacters.Clear ();
  171.         createdTiles.Clear ();
  172.     }
  173.  
  174.     /// <summary>
  175.     /// Resets some necessary data
  176.     /// </summary>
  177.     void Reset() {
  178.         SyntaxChecker.instance.errorMsg.text = "";
  179.         SemanticsChecker.instance.errorMsg.text = "";
  180.  
  181.         level.Clear ();
  182.  
  183.         rows = 0;
  184.         cols = -1;
  185.         r = 0;
  186.         c = 0;
  187.     }
  188.        
  189.  
  190.     /// <summary>
  191.     /// Creates the level by instantiating the tiles in the correct position and rotation.
  192.     /// </summary>
  193.     void CreateLevel() {
  194.         float startX = 0f;
  195.  
  196.         float x = startX;
  197.         float y = 0f;
  198.         float z = 0f;
  199.  
  200.         Transform tile;
  201.  
  202.         for(int i=0; i < level.Count; ++i) {
  203.             for(int j=0; j < level[i].Length; ++j) {
  204.                 Vector3 vec = new Vector3 (x, y, z);
  205.  
  206.  
  207.                 if(level[i][j] == sCorridorHorizontal) {
  208.                     bool isDeadEndLeft  = (j == 0) || level[i][j-1] == sCorridorVertical;
  209.                     bool isDeadEndRight = (j == level[i].Length-1) || level[i][j+1] == sCorridorVertical;
  210.  
  211.                     if(isDeadEndLeft) {
  212.                         tile = CreateDeadEndLeft (vec);
  213.                     }
  214.                     else if(isDeadEndRight) {
  215.                         tile = CreateDeadEndRight (vec);
  216.                     }
  217.                     else {
  218.                         tile = CreateCorridorHorizontal (vec);
  219.                     }
  220.  
  221.                     createdTiles.Add (tile);
  222.                 }
  223.                 else if(level[i][j] == sCorridorVertical) {
  224.                     bool isDeadEndUp    = (i == 0) || level[i-1][j] == sCorridorHorizontal;
  225.                     bool isDeadEndDown  = (i == level.Count-1) || level[i+1][j] == sCorridorHorizontal;
  226.  
  227.                     if(isDeadEndUp) {
  228.                         tile = CreateDeadEndUp (vec);
  229.                     }
  230.                     else if(isDeadEndDown) {
  231.                         tile = CreateDeadEndDown (vec);
  232.                     }
  233.                     else {
  234.                         tile = CreateCorridorVertical (vec);
  235.                     }
  236.  
  237.                     createdTiles.Add (tile);
  238.                 }
  239.  
  240.                 char empty = ' ';
  241.                 if(level[i][j] == sCross) {
  242.                     char up     = (i > 0)                       ? level [i - 1] [j] : empty;
  243.                     char down   = ((i + 1) < level.Count)       ? level [i + 1] [j] : empty;
  244.                     char left   = (j > 0)                       ? level [i] [j - 1] : empty;
  245.                     char right  = ((j + 1) < level [i].Length)  ? level [i] [j + 1] : empty;
  246.  
  247.                     bool isLeftTopCorner        = (up == empty && left == empty && right != empty && down != empty);
  248.                     bool isLeftBottomCorner     = (up != empty && left == empty && right != empty && down == empty);
  249.                     bool isRightTopCorner       = (up == empty && left != empty && right == empty && down != empty);
  250.                     bool isRightBottomCorner    = (up != empty && left != empty && right == empty && down == empty);
  251.  
  252.                     bool isLeftTCross           = (up != empty && left == empty && right != empty && down != empty);
  253.                     bool isRightTCross          = (up != empty && left != empty && right == empty && down != empty);
  254.                     bool isTopTCross            = (up == empty && left != empty && right != empty && down != empty);
  255.                     bool isBottomTCross         = (up != empty && left != empty && right != empty && down == empty);
  256.  
  257.                     bool isCenterCross          = (up != empty && left != empty && right != empty && down != empty);
  258.  
  259.                     bool isDeadEndUp    = (i > 0)                       && (level [i - 1] [j] == sCorridorHorizontal);
  260.                     bool isDeadEndDown  = ((i + 1) < level.Count)       && (level [i + 1] [j] == sCorridorHorizontal);
  261.                     bool isDeadEndLeft  = (j > 0)                       && (level [i] [j - 1] == sCorridorVertical);
  262.                     bool isDeadEndRight = ((j + 1) < level[i].Length)   && (level [i] [j + 1] == sCorridorVertical);
  263.  
  264.                     // long if-sequence:
  265.                     // first the corners
  266.  
  267.                     if(isLeftTopCorner) {
  268.                         if(isDeadEndDown) {
  269.                             // only way: right
  270.                             tile = CreateDeadEndDown(vec);
  271.                         }
  272.                         else if(isDeadEndRight) {
  273.                             // only way: down
  274.                             tile = CreateDeadEndRight(vec);
  275.                         }
  276.                         else {
  277.                             tile = CreateCornerTopLeft (vec);
  278.                         }
  279.  
  280.                         createdTiles.Add (tile);
  281.                     }
  282.                     else if(isLeftBottomCorner) {
  283.                         if(isDeadEndUp) {
  284.                             tile = CreateDeadEndUp (vec);
  285.                         }
  286.                         else if(isDeadEndRight) {
  287.                             tile = CreateDeadEndRight (vec);
  288.                         }
  289.                         else {
  290.                             tile = CreateCornerBottomLeft (vec);
  291.                         }
  292.  
  293.                         createdTiles.Add (tile);
  294.                     }
  295.                     else if(isRightTopCorner) {
  296.                         if(isDeadEndDown) {
  297.                             tile = CreateDeadEndDown (vec);
  298.                         }
  299.                         else if(isDeadEndLeft) {
  300.                             tile = CreateDeadEndLeft (vec);
  301.                         }
  302.                         else {
  303.                             tile = CreateCornerTopRight (vec);
  304.                         }
  305.  
  306.                         createdTiles.Add (tile);
  307.                     }
  308.                     else if(isRightBottomCorner) {
  309.                         if(isDeadEndUp) {
  310.                             tile = CreateDeadEndUp (vec);
  311.                         }
  312.                         else if(isDeadEndLeft) {
  313.                             tile = CreateDeadEndLeft (vec);
  314.                         }
  315.                         else {
  316.                             tile = CreateCornerBottomRight (vec);
  317.                         }
  318.  
  319.                         createdTiles.Add (tile);
  320.                     }
  321.  
  322.                     // still same if case
  323.                     // now TCrosses
  324.  
  325.                     else if(isLeftTCross) {
  326.                         if(isDeadEndUp && isDeadEndDown) {
  327.                             tile = CreateDeadEndLeft (vec);
  328.                         }
  329.                         else if(isDeadEndUp && isDeadEndRight) {
  330.                             tile = CreateDeadEndUp (vec);
  331.                         }
  332.                         else if(isDeadEndDown && isDeadEndRight) {
  333.                             tile = CreateDeadEndDown (vec);
  334.                         }
  335.                         else if(isDeadEndUp) {
  336.                             tile = CreateCornerTopLeft (vec);
  337.                         }
  338.                         else if(isDeadEndDown) {
  339.                             tile = CreateCornerBottomLeft (vec);
  340.                         }
  341.                         else if(isDeadEndRight) {
  342.                             tile = CreateCorridorVertical (vec);
  343.                         }
  344.                         else {
  345.                             tile = CreateTCrossLeft (vec);
  346.                         }
  347.  
  348.                         createdTiles.Add (tile);
  349.                     }
  350.                     else if(isRightTCross) {
  351.                         if(isDeadEndUp && isDeadEndDown) {
  352.                             tile = CreateDeadEndRight (vec);
  353.                         }
  354.                         else if(isDeadEndUp && isDeadEndLeft) {
  355.                             tile = CreateDeadEndUp (vec);
  356.                         }
  357.                         else if(isDeadEndDown && isDeadEndLeft) {
  358.                             tile = CreateDeadEndDown (vec);
  359.                         }
  360.                         else if(isDeadEndUp) {
  361.                             tile = CreateCornerTopRight (vec);
  362.                         }
  363.                         else if(isDeadEndDown) {
  364.                             tile = CreateCornerBottomRight (vec);
  365.                         }
  366.                         else if(isDeadEndLeft) {
  367.                             tile = CreateCorridorVertical (vec);
  368.                         }
  369.                         else {
  370.                             tile = CreateTCrossRight (vec);
  371.                         }
  372.  
  373.                         createdTiles.Add (tile);
  374.                     }
  375.                     else if(isTopTCross) {
  376.                         if(isDeadEndDown && isDeadEndLeft) {
  377.                             tile = CreateDeadEndLeft (vec);
  378.                         }
  379.                         else if(isDeadEndDown && isDeadEndRight) {
  380.                             tile = CreateDeadEndRight (vec);
  381.                         }
  382.                         else if(isDeadEndLeft && isDeadEndRight) {
  383.                             tile = CreateDeadEndUp (vec);
  384.                         }
  385.                         else if(isDeadEndDown) {
  386.                             tile = CreateCorridorHorizontal (vec);
  387.                         }
  388.                         else if(isDeadEndLeft) {
  389.                             tile = CreateCornerTopLeft (vec);
  390.                         }
  391.                         else if(isDeadEndRight) {
  392.                             tile = CreateCornerTopRight (vec);
  393.                         }
  394.                         else {
  395.                             tile = CreateTCrossTop (vec);
  396.                         }
  397.  
  398.                         createdTiles.Add (tile);
  399.                     }
  400.                     else if(isBottomTCross) {
  401.                         if(isDeadEndUp && isDeadEndLeft) {
  402.                             tile = CreateDeadEndLeft (vec);
  403.                         }
  404.                         else if(isDeadEndUp && isDeadEndRight) {
  405.                             tile = CreateDeadEndRight (vec);
  406.                         }
  407.                         else if(isDeadEndLeft && isDeadEndRight) {
  408.                             tile = CreateDeadEndDown (vec);
  409.                         }
  410.                         else if(isDeadEndUp) {
  411.                             tile = CreateCorridorHorizontal (vec);
  412.                         }
  413.                         else if(isDeadEndLeft) {
  414.                             tile = CreateCornerBottomLeft (vec);
  415.                         }
  416.                         else if(isDeadEndRight) {
  417.                             tile = CreateCornerBottomRight (vec);
  418.                         }
  419.                         else {
  420.                             tile = CreateTCrossBottom (vec);
  421.                         }
  422.  
  423.                         createdTiles.Add (tile);
  424.                     }
  425.  
  426.                     // still same if case
  427.                     // now full cross
  428.  
  429.                     else if(isCenterCross) {
  430.                         if(isDeadEndUp && isDeadEndDown && isDeadEndLeft) {
  431.                             tile = CreateDeadEndLeft (vec);
  432.                         }
  433.                         else if(isDeadEndUp && isDeadEndDown && isDeadEndRight) {
  434.                             tile = CreateDeadEndRight (vec);
  435.                         }
  436.                         else if(isDeadEndUp && isDeadEndLeft && isDeadEndRight) {
  437.                             tile = CreateDeadEndUp (vec);
  438.                         }
  439.                         else if(isDeadEndDown && isDeadEndLeft && isDeadEndRight) {
  440.                             tile = CreateDeadEndDown (vec);
  441.                         }
  442.                         else if(isDeadEndUp && isDeadEndDown) {
  443.                             tile = CreateCorridorHorizontal (vec);
  444.                         }
  445.                         else if(isDeadEndUp && isDeadEndLeft) {
  446.                             tile = CreateCornerTopRight (vec);
  447.                         }
  448.                         else if(isDeadEndUp && isDeadEndRight) {
  449.                             tile = CreateCornerTopLeft (vec);
  450.                         }
  451.                         else if(isDeadEndDown && isDeadEndLeft) {
  452.                             tile = CreateCornerBottomLeft (vec);
  453.                         }
  454.                         else if(isDeadEndDown && isDeadEndRight) {
  455.                             tile = CreateCornerBottomRight (vec);
  456.                         }
  457.                         else if(isDeadEndLeft && isDeadEndRight) {
  458.                             tile = CreateCorridorVertical (vec);
  459.                         }
  460.                         else if(isDeadEndUp) {
  461.                             tile = CreateTCrossTop (vec);
  462.                         }
  463.                         else if(isDeadEndDown) {
  464.                             tile = CreateTCrossBottom (vec);
  465.                         }
  466.                         else if(isDeadEndLeft) {
  467.                             tile = CreateTCrossLeft (vec);
  468.                         }
  469.                         else if(isDeadEndRight) {
  470.                             tile = CreateTCrossRight (vec);
  471.                         }
  472.                         else {
  473.                             tile = CreateCross (vec);
  474.                         }
  475.  
  476.                         createdTiles.Add (tile);
  477.                     }
  478.  
  479.                     // end of long if-sequence
  480.                     // end of long if-sequence
  481.                     // end of long if-sequence
  482.                 }
  483.  
  484.                 x += 1f;    // advance to the right
  485.             } // for(j)
  486.             z -= 1f;        // advance down
  487.             x = startX;     // start from the left
  488.         } // for(i)
  489.     } // CreateLevel()
  490.  
  491.  
  492.     // ---
  493.     // | |
  494.     // | |
  495.     Transform CreateDeadEndUp(Vector3 vec) {
  496.         return InstantiateWithRotationAndCreateWayPointData (deadEnd, vec, 0f, false, true, false, false);
  497.     }
  498.  
  499.     // | |
  500.     // | |
  501.     // ---
  502.     Transform CreateDeadEndDown(Vector3 vec) {
  503.         return InstantiateWithRotationAndCreateWayPointData (deadEnd, vec, 180f, true, false, false, false);
  504.     }
  505.  
  506.     // |-----
  507.     // |
  508.     // |-----
  509.     Transform CreateDeadEndLeft(Vector3 vec) {
  510.         return InstantiateWithRotationAndCreateWayPointData (deadEnd, vec, -90f, false, false, false, true);
  511.     }
  512.  
  513.     // -----|
  514.     //      |
  515.     // -----|
  516.     Transform CreateDeadEndRight(Vector3 vec) {
  517.         return InstantiateWithRotationAndCreateWayPointData (deadEnd, vec, 90f, false, false, true, false);
  518.     }
  519.  
  520.     //
  521.     // --------
  522.     // --------
  523.     //
  524.     Transform CreateCorridorHorizontal(Vector3 vec) {
  525.         return InstantiateWithRotationAndCreateWayPointData(corridor, vec, 90f, false, false, true, true);
  526.     }
  527.  
  528.     // ||
  529.     // ||
  530.     // ||
  531.     Transform CreateCorridorVertical(Vector3 vec) {
  532.         return InstantiateWithRotationAndCreateWayPointData(corridor, vec, 0f, true, true, false, false);
  533.     }
  534.  
  535.     // --------
  536.     // |  -----
  537.     // | |
  538.     // | |
  539.     Transform CreateCornerTopLeft(Vector3 vec) {
  540.         return InstantiateWithRotationAndCreateWayPointData(corner, vec, -90f, false, true, false, true);
  541.     }
  542.  
  543.     // --------
  544.     // -----   |
  545.     //      |  |
  546.     //      |  |
  547.     Transform CreateCornerTopRight(Vector3 vec) {
  548.         return InstantiateWithRotationAndCreateWayPointData(corner, vec, 0f, false, true, true, false);
  549.     }
  550.  
  551.  
  552.     // |  |
  553.     // |  |
  554.     // |   -----
  555.     //  --------
  556.     Transform CreateCornerBottomLeft(Vector3 vec) {
  557.         return InstantiateWithRotationAndCreateWayPointData(corner, vec, 180f, true, false, false, true);
  558.     }
  559.  
  560.     //      |  |
  561.     //      |  |
  562.     // -----   |
  563.     // --------
  564.     Transform CreateCornerBottomRight(Vector3 vec) {
  565.         return InstantiateWithRotationAndCreateWayPointData(corner, vec, 90f, true, false, true, false);
  566.     }
  567.  
  568.     // --------
  569.     //    ||
  570.     //    ||
  571.     Transform CreateTCrossTop(Vector3 vec) {
  572.         return InstantiateWithRotationAndCreateWayPointData (tCross, vec, 90f, false, true, true, true);
  573.     }
  574.  
  575.     //    ||
  576.     //    ||
  577.     // --------
  578.     Transform CreateTCrossBottom(Vector3 vec) {
  579.         return InstantiateWithRotationAndCreateWayPointData (tCross, vec, -90f, true, false, true, true);
  580.     }
  581.  
  582.     //      ||
  583.     // -----||
  584.     //      ||
  585.     Transform CreateTCrossRight(Vector3 vec) {
  586.         return InstantiateWithRotationAndCreateWayPointData (tCross, vec, 180f, true, true, true, false);
  587.     }
  588.  
  589.     // ||
  590.     // ||----
  591.     // ||
  592.     Transform CreateTCrossLeft(Vector3 vec) {
  593.         return InstantiateWithRotationAndCreateWayPointData (tCross, vec, 0f, true, true, false, true);
  594.     }
  595.  
  596.     //    ||
  597.     // --------
  598.     // --------
  599.     //    ||
  600.     Transform CreateCross(Vector3 vec) {
  601.         return InstantiateWithRotationAndCreateWayPointData(cross, vec, 0f, true, true, true, true);
  602.     }
  603.  
  604.  
  605.     /// <summary>
  606.     /// Instantiates the given Transform object (a tile) at position 'vec', rotated by 'deg' degrees.
  607.     /// The boolean parameters are used to store the necessary information to create the WayPoint data for each tile later on.
  608.     /// </summary>
  609.     /// <returns>The instantiated object at position 'vec', rotated by 'deg' degrees.</returns>
  610.     /// <param name="obj">The Transform to be instantiated.</param>
  611.     /// <param name="vec">The Position at which the object is instantiated.</param>
  612.     /// <param name="deg">The degree by which the object is rotated.</param>
  613.     /// <param name="goUp">If set to <c>true</c> it's possible to go up.</param>
  614.     /// <param name="goDown">If set to <c>true</c> it's possible to go down.</param>
  615.     /// <param name="goLeft">If set to <c>true</c> it's possible to go left.</param>
  616.     /// <param name="goRight">If set to <c>true</c> it's possible to go right.</param>
  617.     Transform InstantiateWithRotationAndCreateWayPointData(Transform obj, Vector3 vec, float deg, bool goUp, bool goDown, bool goLeft, bool goRight) {
  618.         Vector3 rot = obj.transform.eulerAngles;
  619.         rot = new Vector3 (rot.x, rot.y + deg, rot.z);
  620.         Transform result = Instantiate (obj, vec, Quaternion.Euler (rot));
  621.  
  622.         WayPointData temp;
  623.         temp.tile = result;
  624.         temp.goUp = goUp;
  625.         temp.goDown = goDown;
  626.         temp.goLeft = goLeft;
  627.         temp.goRight = goRight;
  628.  
  629.         if(r < rows && c < cols) {
  630.             wayPointDataArray [r, c++] = temp;
  631.  
  632.             if(c == cols) {
  633.                 r++;
  634.                 c = 0;
  635.             }
  636.         }
  637.  
  638.         return result;
  639.     } // InstantiateWithRotationAndCreateWayPointData()
  640.  
  641.     /// <summary>
  642.     /// Sets the way points of each tile in the level.
  643.     /// </summary>
  644.     void SetWayPoints() {
  645.         // map
  646.         for(int i=0; i < rows; ++i) {
  647.             for(int j=0; j < cols; ++j) {
  648.                 WayPointData temp = wayPointDataArray [i, j];
  649.                 Transform obj = temp.tile;
  650.  
  651.                 if(obj != null) {
  652.                     WayPoint wp = obj.GetComponent<WayPoint> ();
  653.                     if(temp.goUp) {
  654.                         wp.upWaypoint = wayPointDataArray [i - 1, j].tile.GetComponent<WayPoint> ();
  655.                     }
  656.                     if(temp.goDown) {
  657.                         wp.downWaypoint = wayPointDataArray [i + 1, j].tile.GetComponent<WayPoint> ();
  658.                     }
  659.                     if(temp.goLeft) {
  660.                         wp.leftWaypoint = wayPointDataArray [i, j - 1].tile.GetComponent<WayPoint> ();
  661.                     }
  662.                     if(temp.goRight) {
  663.                         wp.rightWaypoint = wayPointDataArray [i, j + 1].tile.GetComponent<WayPoint> ();
  664.                     }
  665.                 }
  666.             } // for(j)
  667.         } // for(i)
  668.     } // SetWayPoints()
  669.  
  670.  
  671.     /// <summary>
  672.     /// Sets the necessary data (currentWayPoint and position) of each character and instantiates them.
  673.     /// </summary>
  674.     void SetAndInstantiateCharacters() {
  675.         InstantiateCharacter (ref pacman, pacmanX, pacmanZ);
  676.         InstantiateCharacter (ref blinky, blinkyX, blinkyZ);
  677.         InstantiateCharacter (ref pinky,  pinkyX,  pinkyZ);
  678.         InstantiateCharacter (ref inky,   inkyX,   inkyZ);
  679.         InstantiateCharacter (ref clyde,  clydeX,  clydeZ);
  680.     } // SetAndInstantiateCharacters()
  681.  
  682.  
  683.     /// <summary>
  684.     /// Instantiates the given character at position (x, z).
  685.     /// </summary>
  686.     /// <param name="character">The character to instantiate.</param>
  687.     /// <param name="x">The x coordinate.</param>
  688.     /// <param name="z">The z coordinate.</param>
  689.     void InstantiateCharacter(ref Transform character, int x, int z) {
  690.         // note the negation of the z-value!!
  691.         Transform tile = wayPointDataArray [-z, x].tile;
  692.         if(tile != null) {
  693.             WayPoint wp = tile.GetComponent<WayPoint> ();
  694.             if(character.CompareTag ("Pacman")) {
  695.                 character.GetComponent<PlayerControlScript> ().currentWaypoint = wp;
  696.             }
  697.             else{
  698.                 character.GetComponent<EnemyBehaviourScript> ().currentWaypoint = wp;
  699.             }
  700.  
  701.             Transform instantiatedCharacter;
  702.             instantiatedCharacter = Instantiate (character, new Vector3 (x, character.transform.position.y, z), Quaternion.identity);
  703.             createdCharacters.Add (instantiatedCharacter);
  704.         }
  705.     } // InstantiateCharacter()
  706. }
Advertisement
Add Comment
Please, Sign In to add comment