示例#1
0
    int controlPoints; //How many control points to use in generation

    #endregion Fields

    #region Methods

    /// <summary>
    /// Find all tiles within a range
    /// </summary>
    /// <param name="start">Tile to start search on</param>
    /// <param name="range">Movement range</param>
    /// <returns>List of tiles within range</returns>
    public static List<HexTile> HexesWithinRange(HexTile start, int range)
    {
        List<HexTile> visited = new List<HexTile>();
        visited.Add(start);

        List<List<HexTile>> fringes = new List<List<HexTile>>();
        fringes.Add(new List<HexTile>());
        fringes[0].Add(start);
        for (int i = 1; i <= range; i++)
        {
            fringes.Add(new List<HexTile>());

            foreach (HexTile ht in fringes[i - 1])
            {
                for (int j = 0; j < 6; j++)
                {
                    HexTile neighbor_tile = ht.GetNeighbor(ht.Directions[j]);
                    if (neighbor_tile != null)
                        if (!visited.Contains(neighbor_tile))
                        {
                            visited.Add(neighbor_tile);
                            fringes[i].Add(neighbor_tile);
                        }
                }
            }
        }

        return visited;
    }
示例#2
0
文件: MapEditor.cs 项目: jadmz/HexMap
    protected override void generateMap()
    {
        // Get the size and extent
        Vector2 hexExtent = getHexExtent();
        Vector2 hexSize = getHexSize();
        _map = new HexTile[(int)MapSize.x, (int)MapSize.y];

        // For each row, or each y coordinate
        for(int i = 0; i<MapSize.y; i++){
            float zpos = StartPosition.y + i*hexExtent.y*1.5F;
            float xOffset = hexExtent.x *i;

            // For each column or x coordinate
            for(int j = 0; j<MapSize.x; j++){
                float xPos = j*hexSize.x+xOffset-(i/2)*hexSize.x;
                Vector3 pos = new Vector3(xPos, 0, zpos);
                GameObject obj = (GameObject)Instantiate(HexPrefab);
                HexTile tile = obj.GetComponent<HexTile>();
                _map[j,i] = tile;
                tile.gameObject.transform.position = pos;
                tile.SetLocation(toMapPosition(j, i));
                tile.Map = this;
            }
        }
    }
示例#3
0
    private void initiateMoveToTile( HexTile src, HexTile dst, GameObject unit)
    {
        //		GameObject gm = GameObject.Find("GameMaster");
        //		Pathfinder pf = gm.GetComponent<Pathfinder>();

        GetComponent<Player_CommandList>().CmdMoveUnitToTile( unit, src.gameObject, dst.gameObject);
    }
示例#4
0
    /// <summary>
    /// Find water tiles within a range
    /// </summary>
    /// <param name="start">Tile to start search on</param>
    /// <param name="movement">Movement range</param>
    /// <returns>List of water tiles within range</returns>
    public static List<HexTile> MovementHex(HexTile start, int movement)
    {
        List<HexTile> visited = new List<HexTile>();
        visited.Add(start);

        List<List<HexTile>> fringes = new List<List<HexTile>>();
        fringes.Add(new List<HexTile>());
        fringes[0].Add(start);
        for(int i = 1; i <= movement; i++)
        {
            fringes.Add(new List<HexTile>());

            foreach(HexTile ht in fringes[i - 1])
            {
                for (int j = 0; j < 6; j++)
                {
                    HexTile neighbor_tile = ht.GetNeighbor(ht.Directions[j]);
                    if (neighbor_tile != null)
                        if (!visited.Contains(neighbor_tile) && neighbor_tile.IsWater)
                        {
                            visited.Add(neighbor_tile);
                            fringes[i].Add(neighbor_tile);
                        }
                }
            }
        }

        return visited;
    }
示例#5
0
    public void SelectTile( Vector3 _position )
    {
        if ( b )
        {
            this.selectedTile = GameManager.instance.terrainManager.GetTileClosestTo( _position );
        }
        else
        {
            tile2 = GameManager.instance.terrainManager.GetTileClosestTo( _position );
        }
        b = !b;

        GameManager.instance.terrainManager.RemoveHighlights();
        if ( this.selectedTile != null )
        {
            this.selectedTile.SetHighlight( true );
        }

        if ( this.selectedTile != null && this.tile2 != null )
        {
            this.path = GameManager.instance.terrainManager.FindPath( this.selectedTile, this.tile2 );
        }

        foreach ( HexTile tile in this.path )
        {
            tile.SetHighlight( true );
        }
    }
示例#6
0
 public SearchNode(HexTile tile, int cost, int distToGoal, SearchNode parent)
 {
     Tile = tile;
     Cost = cost;
     Tile = tile;
     Parent = parent;
 }
示例#7
0
文件: Actor.cs 项目: jadmz/HexMap
 /// <summary>
 /// Move to the specified tile.
 /// </summary>
 /// <param name='tile'>
 /// Tile.
 /// </param>
 public virtual void move(HexTile tile)
 {
     if(tile != null){
         Map map = Tile.Map;
         _path = map.AStarSearch(Tile, tile);
         performMove();
     }
 }
示例#8
0
 public void VerifyResourcesTest()
 {
     HexTile tile = new HexTile();
     ResourceDictionary resources = HexTile.Constants.Instance;
     Assert.AreEqual(HexTile.Constants.HEX_EDGE_LENGTH, resources["HEX_EDGE_LENGTH"]);
     Assert.AreEqual(HexTile.Constants.HEX_SIDES, resources["HEX_SIDES"]);
     Assert.AreEqual(HexTile.Constants.HEX_TILE_RADIUS_X, resources["HEX_TILE_RADIUS_X"]);
     Assert.AreEqual(HexTile.Constants.HEX_POINTS, resources["HEX_POINTS"]);
 }
示例#9
0
 public void buildPath(HexTile pFrom, HexTile destination, Color c)
 {
     foreach (HexTile til in currentPath)
     {
         til.changeBackColor();
     }
     currentPath.Clear();
     start = pFrom;
     computePath(start, destination, c);
 }
示例#10
0
    private bool canPathToTile( HexTile src, HexTile dst, GameObject unit)
    {
        GameObject gm = GameObject.Find("GameMaster");
        Pathfinder pf = gm.GetComponent<Pathfinder>();

        ArrayList reachables = pf.reachables( unit.GetComponent<Moveable>(), src);

        if ( reachables.Contains( dst))
            return true;

        return false;
    }
    // Instantiates and returns an overlay for the given HexTile
    GameObject InstantiateOverlay(HexTile tile)
    {
        // Instantiate gameObject
        GameObject instance = Instantiate(HexOverlayObject, tile.Position, Quaternion.identity) as GameObject;

        // Set some attributes
        instance.name = "hexOverlay";
        var overlayScript = instance.GetComponent<HexOverlay>();
        overlayScript.X = tile.X;
        overlayScript.Y = tile.Y;
        return instance;
    }
示例#12
0
 void Start()
 {
     map = new HexTile[width, height];
     for ( int i=0; i < width; ++i ) {
         for ( int j=0; j < height; ++j ) {
             var q = j - Mathf.FloorToInt( i * 0.5f );
             var r = i;
             var trans = Spawn( new CubeCoordinate( q, r ) );
             map[ i, j ] = new HexTile( q, r, trans );
         }
     }
 }
示例#13
0
        internal HexTile Clone()
        {
            var clone = new HexTile();

            for (int i = 0; i < 6; i++)
            {
                clone.TriTiles[i] = TriTiles[i].CreateClone();
                clone.TriTiles[i].HexTile = clone;
                clone.IsActive = IsActive;
            }

            return clone;
        }
示例#14
0
文件: Actor.cs 项目: beardhero/HEX
    public IEnumerator MoveToTile(HexTile t, float time)
    {
        Vector3 startingPos = instanceTrans.position, endingPos = t.hexagon.center+t.hexagon.normal;
        Quaternion startingRot = instanceTrans.rotation,
        endingRot = Quaternion.LookRotation(endingPos-startingPos, t.hexagon.normal);

        for (float i=0; i<time; i+=Time.deltaTime)
        {
          instanceTrans.position = Vector3.Lerp(startingPos, endingPos, i/time);
          instanceTrans.rotation = Quaternion.Slerp(startingRot, endingRot, i/time);
          yield return null;
        }
    }
示例#15
0
 public HexMap(int w, int h)
 {
     this.w = w;
     this.h = h;
     map = new HexTile[w * h];
     for (int i = 0; i < w * h; i++) {
         map [i] = new HexTile ();
     }
     void_tile = new HexTile ();
     void_tile.go_visible = false;
     void_tile.outside = true;
     void_tile.darkness = 1;
     void_tile.tile = new TileType ();
     void_tile.tile.voided = true;
 }
    //Writes the coordinates on the HexField (Used for testing)
    public void setTextCoordinates(HexTile hex, string strCoordinates)
    {
        GameObject positionText;
        TextMesh text;

        positionText = hex.transform.Find("Position").gameObject;

        if(positionText != null)
        {
            text = positionText.GetComponent<TextMesh>();
            text.text = strCoordinates;
        }
        else
        {
            Debug.LogError("Could not find TextMesh object.");
        }
    }
示例#17
0
文件: Moveable.cs 项目: gelum/TBA
    // Update is called once per frame
    void Update()
    {
        //		if ( !isServer)
        //		{

        if ( pathToTake != null && pathToTake.Count != 0 && pathingTo == null)
        {
            Debug.Log("Hi");
            GetComponent<Animator>().Play ("pawn_walk");
            pathingTo = ((GameObject)pathToTake[ 0]).GetComponent<HexTile>();
            pathingTo.occupants.Remove( gameObject);

            float checkMe = occupying.centre.x - pathingTo.centre.x;
            if ( checkMe < 0)
            {
                transform.localScale = new Vector3( -50, 50, 1);
            }
            else if ( checkMe > 0)
            {
                transform.localScale = new Vector3(  50, 50, 1);
            }

            pathToTake.RemoveAt( 0);
        }

        if ( pathingTo != null)
        {
            float step = speed * Time.deltaTime;
            transform.position = Vector3.MoveTowards( transform.position, pathingTo.centre, step);

            if ( transform.position == pathingTo.centre)
            {
                pathingTo.occupants.Add ( gameObject);
                occupying = pathingTo;
                pathingTo = null;
                GetComponent<Animator>().Play ("pawn_idle");
            }
        }
        //		} else {
        //			LerpPosition();
        //		}
    }
示例#18
0
	public void Move(int dir) {
		bool validMove = ValidMove (dir);
		if (validMove && movement != 0) {
			tile.character = null;

			switch (dir) {
			case 1:
				tile.NW_Tile.character = this.gameObject;
				tile = tile.NW_Tile;
				break;
			case 2:
				tile.NE_Tile.character = this.gameObject;
				tile = tile.NE_Tile;
				break;
			case 3:
				tile.E_Tile.character = this.gameObject;
				tile = tile.E_Tile;
				break;
			case 4:
				tile.SE_Tile.character = this.gameObject;
				tile = tile.SE_Tile;
				break;
			case 5:
				tile.SW_Tile.character = this.gameObject;
				tile = tile.SW_Tile;
				break;
			case 6:
				tile.W_Tile.character = this.gameObject;
				tile = tile.W_Tile;
				break;
			default:
				break;
			}

			moving = true;
			movement = movement - tile.mov_cost;
		}

		if (movement == 0) {
			Active = false;
		}
	}
示例#19
0
文件: MapEditor.cs 项目: jadmz/HexMap
    protected void sizeChange(int x, int y)
    {
        HexTile[,] map = new HexTile[x, y];
        // Get the size and extent
        Vector2 hexExtent = getHexExtent();
        Vector2 hexSize = getHexSize();

        // For each row, or each y coordinate
        for(int i = 0; i<map.GetLength(1); i++){
            float zpos = StartPosition.y + i*hexExtent.y*1.5F;
            float xOffset = hexExtent.x *i;

            // For each column or x coordinate
            for(int j = 0; j<map.GetLength(0); j++){
                float xPos = j*hexSize.x+xOffset-(i/2)*hexSize.x;
                Vector3 pos = new Vector3(xPos, 0, zpos);
                if(j<_map.GetLength(0) && i<_map.GetLength(1)){
                    map[j, i] = _map[j, i];
                }
                else{
                    GameObject obj = (GameObject)Instantiate(HexPrefab);
                    HexTile tile = obj.GetComponent<HexTile>();
                    map[j,i] = tile;
                    tile.gameObject.transform.position = pos;
                    tile.SetLocation(toMapPosition(j, i));
                    tile.Map = this;
                }
            }
        }

        if(MapSize.x -x >0 || MapSize.y- y >0){
            for(int i = 0; i < _map.GetLength(1); i++){
                for(int j = 0; j< _map.GetLength(0); j ++){
                    if(i>=y || j>= x){
                        Destroy(_map[j,i].gameObject);
                    }
                }
            }
        }
        _map = map;
        MapSize = new Vector2(_map.GetLength(0), _map.GetLength(1));
    }
示例#20
0
 public AxialCoord AddDirection( HexTile.TILE_DIRECTION _dir )
 {
     switch ( _dir )
     {
         case HexTile.TILE_DIRECTION.EAST:
             return new AxialCoord( this.q + 1, this.r );
         case HexTile.TILE_DIRECTION.WEST:
             return new AxialCoord( this.q - 1, this.r );
         case HexTile.TILE_DIRECTION.NORTH_EAST:
             return new AxialCoord( this.q + 1, this.r + 1 );
         case HexTile.TILE_DIRECTION.NORTH_WEST:
             return new AxialCoord( this.q , this.r + 1 );
         case HexTile.TILE_DIRECTION.SOUTH_EAST:
             return new AxialCoord( this.q, this.r - 1 );
         case HexTile.TILE_DIRECTION.SOUTH_WEST:
             return new AxialCoord( this.q - 1, this.r - 1 );
         default:
             throw new ArgumentException();
     }
 }
示例#21
0
 void computePath(HexTile from, HexTile destination, Color c)
 {
     float bestDistance = 99999;
     HexTile bestTile = null;
     foreach (HexTile til in from.AllNeighbours)
     {
         if ((til.isPassable() || til == destination) && !visitedTiles.Contains(til) && til.isHighlighted())
         {
             float currentDistance = getDistance(til, destination);
             if (currentDistance < bestDistance)
             {
                 bestDistance = currentDistance;
                 bestTile = til;
             }
         }
     }
     if (bestTile != null)
     {
         visitedTiles.Add(bestTile);
         currentPath.Add(bestTile);
         if (!bestTile.boardPosition.Equals(destination.boardPosition))
         {
             computePath(bestTile, destination, c);
         }
         else
         {
             foreach (HexTile til in currentPath)
             {
                 til.changeColor(c);
             }
             start.unit.GetComponent<BasicUnit>().setPath(currentPath);
             visitedTiles.Clear();
         }
     }
     else
     {
         currentPath.Clear();
         computePath(start, destination, c);
     }
 }
示例#22
0
文件: Port.cs 项目: Syldarion/DJD-JP
    public HexTile SpawnTile; //Tile ships from port are spawned on

    #endregion Fields

    #region Methods

    /// <summary>
    /// Finds nearby water tile to set as spawn tile and initializes port market
    /// </summary>
    public void InitializePort()
    {
        foreach (HexCoordinate hc in GetComponentInParent<HexTile>().Directions)
        {
            HexTile neighbor = GetComponentInParent<HexTile>().GetNeighbor(hc);

            if (neighbor && neighbor.IsWater)
            {
                SpawnTile = GetComponentInParent<HexTile>().GetNeighbor(hc);
                break;
            }
        }

        Market = new Cargo(Random.Range(0, 500), Random.Range(0, 500), Random.Range(0, 500), Random.Range(0, 500), Random.Range(0, 500));

        PortGold = Random.Range(5000, 20000);

        PortPrices.Clear();

        for (var i = 0; i < 5; i++)
            PortPrices.Add(DefaultPortPrices[i] + Random.Range(-PortPriceMods[i], PortPriceMods[i]));
    }
示例#23
0
    void SetUpCubeCoords( HexTile root, Vector3 theCoord)
    {
        if ( !root.cubeCoordSetUp)
        {
            root.cubeCoordSetUp = true;
            root.cubeCoord = theCoord;

            // set up left
            Vector3 theNewCoord = theCoord + new Vector3(1, -1, 0);
            if ( root.left != null)
                SetUpCubeCoords(root.left.GetComponent<HexTile>(), theNewCoord);

            // set up up left
            theNewCoord = theCoord + new Vector3(1, 0, -1);
            if (root.up_left != null)
                SetUpCubeCoords(root.up_left.GetComponent<HexTile>(), theNewCoord);

            // set up up right
            theNewCoord = theCoord + new Vector3(0, 1, -1);
            if (root.up_right != null)
                SetUpCubeCoords(root.up_right.GetComponent<HexTile>(), theNewCoord);

            // set up right
            theNewCoord = theCoord + new Vector3(-1, 1, 0);
            if (root.right != null)
                SetUpCubeCoords(root.right.GetComponent<HexTile>(), theNewCoord);

            // set up down right
            theNewCoord = theCoord + new Vector3(-1, 0, 1);
            if (root.down_right != null)
                SetUpCubeCoords(root.down_right.GetComponent<HexTile>(), theNewCoord);

            // set up down left
            theNewCoord = theCoord + new Vector3(0, -1, 1);
            if (root.down_left != null)
                SetUpCubeCoords(root.down_left.GetComponent<HexTile>(), theNewCoord);
        }
    }
示例#24
0
文件: Pathfinder.cs 项目: gelum/TBA
    public Dictionary<HexTile, HexTile> GetPathToTile( Moveable peep, HexTile source, HexTile destination)
    {
        Dictionary<HexTile, HexTile> cameFrom = new Dictionary<HexTile, HexTile>();
        Dictionary<HexTile, int> costSoFar = new Dictionary<HexTile, int>();

        var frontier = new PriorityQueue<HexTile>();
        frontier.Enqueue(source, 0);

        cameFrom[source] = source;
        costSoFar[source] = 0;

        while (frontier.Count > 0)
        {
            var current = frontier.Dequeue();

            if (current.Equals(destination))
            {
                break;
            }

            foreach (var next in current.Neighbours( peep))
            {
                GameObject nextObj = (GameObject) next;
                HexTile nextTile = nextObj.GetComponent<HexTile>();
                int newCost = costSoFar[current] + Cost( current, nextTile);
                if (!costSoFar.ContainsKey(nextTile) || newCost < costSoFar[nextTile])
                {
                    costSoFar[nextTile] = newCost;
                    int priority = newCost + Heuristic(nextTile, destination);
                    frontier.Enqueue(nextTile, priority);
                    cameFrom[nextTile] = current;
                }
            }
        }

        return cameFrom;
    }
示例#25
0
    /// <summary>
    /// Generate a HexGrid by providing a filename to be read, and then generated from.
    /// </summary>
    /// <param name="grid"></param>
    /// <param name="filename"></param>
    public static void GenerateFromFile(HexGrid grid, string filename)
    {
        List <HexMapCsv> file = HexMapFileSaver.ReadFile(filename);

        // Create a throwaway tile so that we can get the dimensions of it.
        Vector2 spriteSize = GetTileSize();

        foreach (HexMapCsv row in file)
        {
            if (row.TileType != TileType.Empty)
            {
                Debug.Log("HELLO");
            }

            int x = row.X;
            int z = row.Z;

            float mod = z % 2;

            Vector2 position = new Vector2((x * spriteSize.x) + ((spriteSize.x * 0.5f) * mod), (z * spriteSize.y) * 0.75f);

            grid.Tiles.Add(HexTile.Create(grid, row.TileType, position, new Vector2(x, z)));
        }
    }
示例#26
0
    GameObject SpawnNewTile(GameObject pickedTile, int column, int row)
    {
        GameObject tile = Instantiate(pickedTile);

        if (tile)
        {
            tile.transform.parent = tileMap.transform;
            float tileOffset = (row % 2 == 0) ? 0 : 0.5f;
            tile.transform.position = new Vector3(column + tileOffset, row * (float)(tileWidth + 2) / tileHeight, 0);

            HexTile newHex = tile.GetComponent <HexTile>();

            if (newHex)
            {
                newHex.tileColumn = column;
                newHex.tileRow    = row;
                tilesToGrowFrom.Add(newHex);
                Debug.Log("New Hex Tile created at Column " + newHex.tileColumn + ", Row " + newHex.tileRow);
            }

            availableTileLocations = RemoveTileLocation(availableTileLocations);
        }
        return(tile);
    }
示例#27
0
    IEnumerator ScanDelayed()
    {
        yield return(0);

        // due to how GetTile works, we need to wait
        // perhaps there is a way to do it some other way, but whatever
        // look for neighbours before we deactivate tiles out of range
        foreach (var tile in Tiles)
        {
            tile.neighbours = Neighbours(tile);
        }

        Vector3 center = gameObject.transform.position;

        // deactivate tiles out of range, hide instead?
        foreach (var tile in Tiles)
        {
            if (Vector3.Distance(tile.transform.position, center) >= minDistance * tileXOffset)
            {
                tile.SetHidden();
            }
        }

        if (AstarPath.active == null)
        {
            Debug.LogError("Astar not active", this);
        }
        else
        {
            AstarPath.active.Scan();
        }

        CenterTile = GetTileAt(new Vector3(0, 0, 0));

        onMapReady?.Invoke(Tiles);
    }
示例#28
0
    /// <summary>
    /// Reveal tiles around this one
    /// </summary>
    /// <param name="center"></param>
    public bool Reveal(HexTile center)
    {
        // need a list of surrounding tiles,
        bool rescan        = false;
        int  revealedCount = 0;

        for (var i = 0; i < center.neighbours.Count; i++)
        {
            var  tile     = center.neighbours[i];
            bool revealed = tile.Reveal(revealedCount * 0.1f);
            if (revealed)
            {
                revealedCount++;
            }

            rescan |= revealed;
        }

        if (!rescan)
        {
            return(false);
        }
        // perhaps in real game we could disable certain nodes instead of rescanning
        // hidden tiles are deactivate and not visible to Scan() when we first init them
        // there can be 'holes' in map, so we can just scan all of them and disable after
        // unless we remove them from pathfinding somehow
        if (AstarPath.active == null)
        {
            Debug.LogError("Astar not active", this);
        }
        else
        {
            AstarPath.active.Scan();
        }
        return(true);
    }
示例#29
0
    void SelectTileByScreenPointToRay(Vector3 screenPoint)
    {
        if (hexNavMapManager == null)
        {
            return;
        }

        GameObject hexTileObject = hexNavMapManager.SelectTileByScreenPointToRay(screenPoint, canAttack);

        if (hexTileObject != null)         //不是空地
        {
            currentHexTile = hexTileObject.GetComponent <HexTile> ();
            pathHexTileList.Add(hexTileObject);
            if (currentHexTile.unit != null)
            {
                Enemy enemy = currentHexTile.unit.GetComponent <Enemy>();
                Hero  hero  = currentHexTile.unit.GetComponent <Hero>();

                if (canAttack && enemy != null)
                {
                    PlayBattle();
                    canAttack = false;
                    return;
                }

                if (hero)
                {
                    tempStep = hero.step;
                }
            }
        }
        else
        {
            currentHexTile = null;
        }
    }
示例#30
0
    public HexTile[] GetNeighborsInRange(int radius)
    {
        HashSet <HexTile> tiles = new HashSet <HexTile>();

        for (int dx = -radius; dx <= radius; ++dx)
        {
            for (int dy = Mathf.Max(-radius, -dx - radius); dy <= Mathf.Min(radius, -dx + radius); ++dy)
            {
                int dz = -dx - dy;

                var     center     = new OffsetCoordinate(this.x, this.y);
                var     offsetCube = new CubeCoordinate(dx, dy, dz);
                HexTile neighbor   = HexTile.FindByOffset(center, HexUtils.CubeCoordToOffsetCoord(offsetCube, center.IsEven()));
                if (neighbor != null)
                {
                    tiles.Add(neighbor);
                }
            }
        }

        HexTile[] results = new HexTile[tiles.Count];
        tiles.CopyTo(results);
        return(results);
    }
示例#31
0
 public void SetTile(int x, int y, HexTile tile)
 {
     SetTile(new Point2(x, y), tile);
 }
示例#32
0
        /// <summary>
        /// Given a task type, mercenary, and tile, generate a notification that can be parsed and sent to the UI.
        /// </summary>
        /// <returns>Notification object containing an event.</returns>
        public Notification GenerateNotification(TaskType pType, MercenaryData pMercenary, HexTile pTile, EncounterEvent pEndEvent = null)
        {
            // Get a random event object from the event manifest for the given type. It should contain information as to
            // whether the event is clear-required.

            int lDayLimit = 0;

            foreach (HexTile t in pMercenary.CurrentPath)
            {
                lDayLimit += HexFunctions.Instance.GetRoughTerrainFactor(t.Type);
            }

            if (pType.Equals(TaskType.DUNGEONEER))
            {
                return(new Notification(pType, EncounterController.Instance.DungeoneeringEvent, ParseNotificationLabel(pType, pMercenary), lDayLimit, pMercenary, pTile));
            }

            // Return the generated notification.
            return(new Notification(pType, pEndEvent, ParseNotificationLabel(pType, pMercenary), lDayLimit, pMercenary, pTile));
        }
示例#33
0
        private IEnumerator SetMission()
        {
            // Get the selected mercenary
            selectedTask = TaskType.NONE;
            MercenaryData m = AppUI.Instance.SelectedMercenary;

            if (m == null)
            {
                yield break;
            }

            // Collapse the left menu

            AppUI.Instance.ToggleLeftMenu();

            // Show the "Select a Tile" text

            AppUI.Instance.ToggleSelectTileText(m.Name);

            // Wait for a tile to be selected and confirmed

            yield return(new WaitUntil(() => (Input.GetButtonDown("Submit") && TileSelector.Instance.TargetTile != null)));

            HexTile tile = TileSelector.Instance.TargetTile;

            AppUI.Instance.ToggleSelectTileText();

            // Pop up the task type selection dialog
            // Perform logic here for choosing options to show based on tile type
            DialogManager.Instance.ShowDialog(DialogType.TASK_SELECT);

            int  it             = 1;
            bool didButtonCheck = false;

            if (!didButtonCheck)
            {
                foreach (RectTransform r in TaskTray.transform)
                {
                    if (r == TaskTray)
                    {
                        continue;
                    }

                    r.gameObject.GetComponent <Button>().interactable = IsValidTaskForTile((TaskType)it, tile);

                    it++;
                }
            }

            // wait for a task to be selected
            yield return(new WaitUntil(() => (selectedTask != TaskType.NONE)));

            // Close the selection dialog
            DialogManager.Instance.CloseAllDialogs();

            // Pass the task to the mercenary data
            AppUI.Instance.SelectedMercenary.SetPath(MercenaryController.Instance.GetTaskPath(m.Location, tile));

            // Generate a corresponding notification and push it to the panel
            NotificationController.Instance.AddNotification(GenerateNotification(selectedTask, m, tile, EncounterController.Instance.GetRandomEncounter()));

            AppUI.Instance.UpdateMercInteractionButton(m);

            AppUI.Instance.SwitchPage(0);

            // reset selectedtask
            selectedTask = TaskType.NONE;

            yield return(null);
        }
示例#34
0
    private void BuildBase()
    {
        HexTile startTile = HexGrid.Instance.CenterTile;

        BuildTowerAt(startTile, basePrefab);
    }
示例#35
0
文件: Hero.cs 项目: mengtest/MOBAGame
    //移动到目标
    void MoveToTarget()
    {
        GameObject tileStart = moveHexTileList[0] as GameObject;        //第一块格子(包括英雄本身的格子)
        GameObject tileStop  = moveHexTileList[1] as GameObject;        //下一块格子

        //移动后的朝向
        moveForward = tileStop.transform.position - tileStart.transform.position;     //移动时的方向
        this.gameObject.transform.rotation = Quaternion.FromToRotation(Vector3.forward, moveForward);
        if (this.gameObject.transform.up != Vector3.up)
        {
            this.gameObject.transform.Rotate(0, 0, 180);
        }
        //this.gameObject.transform.rotation = Quaternion.FromToRotation (Vector3.forward, this.gameObject.transform.right);
        usedAp++;
        APShow();         //显示AP变化
        //移动中网格的状态变化
        HexTile theStepTileFirst  = tileStop.GetComponent <HexTile> ();
        HexTile theStepTileSecond = tileStart.GetComponent <HexTile> ();

        theStepTileFirst.Select();
        theStepTileSecond.Idle();

        HexTile hexTileStart = tileStart.GetComponent <HexTile> ();

        hexTileStart.unit = null;

        HexTile hexTileStop = tileStop.GetComponent <HexTile> ();

        if (hexTileStop.unit != null)
        {
            Hero hero = hexTileStop.unit.GetComponent <Hero> ();
            Prop prop = hexTileStop.unit.GetComponent <Prop> ();

            if (prop)
            {
                hexTileStop.unit.SetActive(false);
                heroProp         = prop;
                hexTileStop.unit = gameObject;
            }

            if (hero)
            {
            }
        }
        else
        {
            hexTileStop.unit = gameObject;
        }


        moveHexTileList.RemoveAt(0);         //移除第一个元素

        GameObject line = moveLineList [0] as GameObject;

        moveLineList.RemoveAt(0);
        Destroy(line);


        if (moveHexTileList.Count > 1)
        {
            LetIsGo();
        }
        else
        {
            theStepTileFirst.Select();
            StopMove();
        }
    }
示例#36
0
    private void findNeighbors()
    {
        for (int y = 0; y < height; y++)
        {
            int maxWidth    = width - (y % 2);
            int maxWidthAdj = width - ((y + 1) % 2);

            for (int x = 0; x < maxWidth; x++)
            {
                HexTile tile = GetTile(x, y);

                if (tile.isOccluded || tile.type == HexTileType.Disabled)
                {
                    continue;
                }

                if (x > 0)
                {
                    tile.AddPath(GetTile(x - 1, y));
                }

                if (x < maxWidth - 1)
                {
                    tile.AddPath(GetTile(x + 1, y));
                }

                if (y > 0 && x < maxWidthAdj)
                {
                    tile.AddPath(GetTile(x, y - 1));
                }

                if (y < height - 1 && x < maxWidthAdj)
                {
                    tile.AddPath(GetTile(x, y + 1));
                }

                if (y % 2 == 0)
                {
                    if (y > 0 && x > 0)
                    {
                        tile.AddPath(GetTile(x - 1, y - 1));
                    }

                    if (y < height - 1 && x > 0)
                    {
                        tile.AddPath(GetTile(x - 1, y + 1));
                    }
                }
                else
                {
                    if (y > 0 && x < maxWidthAdj - 1)
                    {
                        tile.AddPath(GetTile(x + 1, y - 1));
                    }

                    if (y < height - 1 && x < maxWidthAdj - 1)
                    {
                        tile.AddPath(GetTile(x + 1, y + 1));
                    }
                }
            }
        }
    }
 public void SetCurrentHex(HexTile hex)
 {
     currentHex = hex;
 }
示例#38
0
    public IEnumerator Move(int destination) //A* pathfinding
    {
        if (!CombatManager.activeWorld.tiles[destination].passable)
        {
            Debug.Log("Destination not passable");
            yield break;
        }
        Debug.Log("Moving to " + destination);
        if (destination == onTile)
        {
            Debug.Log("Standing on destination");
            yield break;
        }
        List <int>            open          = new List <int>(); //to check
        List <int>            closed        = new List <int>(); //checked
        List <int>            path          = new List <int>();
        List <int>            potentialPath = new List <int>();
        Dictionary <int, int> costFromStart = new Dictionary <int, int>();
        Dictionary <int, int> movementCosts = new Dictionary <int, int>();

        //moverange test
        foreach (int i in moveRange)
        {
            CombatManager.activeWorld.tiles[i].MoveUnhighlight();
        }

        closed.Add(onTile); //add current position to closed
        costFromStart.Add(onTile, 0);
        movementCosts.Add(onTile, 0);
        foreach (int n in CombatManager.activeWorld.tiles[onTile].neighbors) //add neighbors to open
        {
            HexTile toOpen = CombatManager.activeWorld.tiles[n];
            if (toOpen.passable)
            {
                open.Add(toOpen.index);
                //Debug.Log("Opened " + toOpen.index);
                int mc = 1;
                int c  = CombatManager.activeWorld.TileDistanceFromTo(n, destination);
                costFromStart.Add(n, mc);
                movementCosts.Add(n, mc + c);
            }
        }
        //Now that we are initialized, we recursively find the shortest path
        //bool searching = true;
        int next       = open[0];
        int lowestCost = 999;

        while (open.Count > 0)
        {
            if (open.Contains(destination))
            {
                //closed.Add(destination);
                path.Add(destination);

                //backtrack to get path
                int bCost = 9999;
                int back  = destination;
                for (int p = 0; p < closed.Count; p++)
                {
                    foreach (int b in CombatManager.activeWorld.tiles[back].neighbors)
                    {
                        //if(b == onTile){break;}
                        if (closed.Contains(b))
                        {
                            if (costFromStart[b] < bCost)
                            {
                                bCost = costFromStart[b];
                                back  = b;
                            }
                        }
                    }
                    if (back == onTile)
                    {
                        break;
                    }
                    path.Add(back);
                }
                //path made now move it
                open.Clear();

                StartCoroutine(MoveOnPath(path));
                break;
            }
            //go to lowest moveCost in open list
            lowestCost = 9999; // movementCosts[next];
            foreach (int h in open)
            {
                if (movementCosts[h] < lowestCost)
                {
                    next       = h; //open[h];
                    lowestCost = movementCosts[h];
                }
            }
            open.Remove(next);
            closed.Add(next);
            Debug.Log("Closed " + next + " Movecost " + movementCosts[next]);
            //on next tile, now check its neighbors
            HexTile nextTile = CombatManager.activeWorld.tiles[next];
            foreach (int n in nextTile.neighbors)
            {
                if (closed.Contains(n))
                {
                    continue;
                }
                //get closed parents to calculate movecost
                int nCost   = 0; //new movement cost
                int lCost   = 999;
                int cParent = -1;
                foreach (int p in CombatManager.activeWorld.tiles[n].neighbors)
                {
                    if (closed.Contains(p))
                    {
                        if (costFromStart[p] < lCost)
                        {
                            lCost   = costFromStart[p];
                            cParent = p;
                        }
                    }
                }
                if (cParent == -1)
                {
                    Debug.LogError("discontinuous path");
                }
                else
                {
                    nCost = lCost + 1 + CombatManager.activeWorld.TileDistanceFromTo(n, destination);
                }

                if (open.Contains(n))
                {
                    //check if score from this path is lower than its current score
                    if (movementCosts[n] > nCost)
                    {
                        movementCosts.Remove(n);
                        movementCosts.Add(n, nCost);
                    }
                }
                else
                {
                    if (CombatManager.activeWorld.tiles[n].passable)
                    {
                        open.Add(n);
                        costFromStart.Add(n, lCost + 1);
                        movementCosts.Add(n, nCost);
                    }
                }
            }
            yield return(null);
        }
        //backtrack from destination to find path
        yield return(null);
    }
示例#39
0
 public HexCorner(HexTile pTile, int pDirection, Vector3 wPoint) : base(pTile, pDirection, wPoint)
 {
 }
示例#40
0
    /*
     * public static List<HexTile> FindHighlight(HexTile originTile, float movementPoints, bool isAttack = false)
     * {
     *  return FindHighlight(originTile, movementPoints, new Vector2[0], isAttack);
     * }
     *
     * public static List<HexTile> FindHighlight(HexTile originTile, float movementPoints, Vector2[] occupied)
     * {
     *  return FindHighlight(originTile, movementPoints, occupied, false);
     * }
     *
     * public static List<HexTile> FindHighlight(HexTile originTile, float movementPoints, Vector2[] occupied, bool isAttack)
     * {
     *  List<HexTile> closed = new List<HexTile>();
     *  List<HexTilePath> open = new List<HexTilePath>();
     *
     *  HexTilePath originPath = new HexTilePath();
     *  originPath.AddTile(originTile, isAttack);
     *
     *  open.Add(originPath);
     *
     *  while (open.Count > 0)
     *  {
     *      HexTilePath current = open[0];
     *      open.Remove(open[0]);
     *      bool isSkip = false;
     *
     *
     *      if (open.Where(x => x.lastTile == current.lastTile && x.costOfPath <= current.costOfPath).Count() > 0)
     *      {
     *          continue;
     *      }
     *
     *      if (closed.Contains(current.lastTile) || (current.lastTile != originTile && current.listOfTiles.GetRange(0, current.listOfTiles.Count - 2).Contains(current.lastTile)))
     *      {
     *          continue;
     *      }
     *      if (current.costOfPath > movementPoints + originTile.m_MovementCost)
     *      {
     *          continue;
     *      }
     *      closed.Add(current.lastTile);
     *
     *      foreach (HexTile t in current.lastTile.m_Neighbors)
     *      {
     *          if (t.m_Impassible || occupied.Contains(t.m_GridPosition) || current.listOfTiles.Contains(t))
     *          {
     *              continue;
     *          }
     *          HexTilePath newTilePath = new HexTilePath(current);
     *          newTilePath.AddTile(t, isAttack);
     *          open.Add(newTilePath);
     *      }
     *  }
     *  closed.Remove(originTile);
     *  return closed;
     * }
     */

    public static List <HexTile> FindHighlight(HexTile originTile, float movementPoints, HexCoord[] occupied, bool isAttack)
    {
        List <HexTile>     closed = new List <HexTile>();
        List <HexTilePath> open   = new List <HexTilePath>();

        HexTilePath originPath = new HexTilePath();

        originPath.AddTile(originTile, isAttack);

        open.Add(originPath);

        while (open.Count > 0)
        {
            HexTilePath current = open[0];
            open.Remove(open[0]);
            bool isSkip = false;

            for (int i = 0; !isSkip && i < open.Count; i++)
            {
                if (open[i].EvaluationPath(current))
                {
                    isSkip = true;
                }
            }

            for (int i = 0; !isSkip && i < current.listOfTiles.Count - 2; i++)
            {
                if (current.listOfTiles[i].Equals(current.lastTile))
                {
                    Debug.LogWarning("Skip path by looping");
                    isSkip = true;
                }
            }
            if (!isSkip && current.costOfPath > movementPoints + originTile.m_MovementCost)
            {
                isSkip = true;
            }
            if (isSkip)
            {
                continue;
            }
            closed.Add(current.lastTile);

            List <HexTile> hexTiles = current.lastTile.m_Neighbors;
            for (int i = 0; i < hexTiles.Count; i++)
            {
                HexTile tile = hexTiles[i];
                if (closed.Contains(tile) ||
                    tile.m_Impassible ||
                    occupied.Contains(tile.m_Hex) ||
                    current.listOfTiles.Contains(tile))
                {
                    continue;
                }
                HexTilePath newTilePath = new HexTilePath(current);
                newTilePath.AddTile(tile, isAttack);
                open.Add(newTilePath);
            }
        }
        closed.Remove(originTile);
        return(closed);
    }
示例#41
0
 protected float HeuristicFunc(HexTile from, HexTile to)
 {
     return(from.hexTransform.CalcHexManhattanDist(to.hexTransform));
 }
示例#42
0
    public static MiniAction DecideAction(GameState gameState, HexTileController htc)
    {
        MoveDebug md           = GameObject.FindGameObjectWithTag("MoveDebug").GetComponent <MoveDebug>();
        int       attackRadius = gameState.selfChar.stats.range;

        // **** Spencer Notes ******

        /*  If you can attack, do
         *  Else evaluate all the locations you could possible move to,
         *  then take the largest and move to it
         */
        //If this character is the hacker, find best possible place to put the attack
        if (gameState.selfChar.characterclass == CharacterClass.HACKER)
        {
            List <HexTile> attackRange  = htc.FindRadius(gameState.selfTile, attackRadius);
            PriorityQueue  attackFringe = new PriorityQueue();
            md.ClearAll();
            foreach (HexTile hex in attackRange)
            {
                GameState gs    = new GameState(gameState.aiChars, gameState.playerChars, hex, gameState.selfChar);
                float     value = EvaluateAOEAttackState(gs, htc);
                md.SetText(hex, value);
                //If this attack will do more damage to yourself, don't add it to the list
                if (value < -1)
                {
                    attackFringe.Push((hex, null), value);
                }
            }
            //If there is nothing in the list (No good attacks) Move intead
            if (attackFringe.HasNext())
            {
                ((HexTile attackHex, List <int> a), float value) = attackFringe.PopWithVal();
                //If this attack only did damage to 1 character (or 1 more than your own chars)

                /* *** Come back if you have more time ****
                 * if (value <= gameState.selfChar.stats.attackdmg)
                 * {
                 *  //Find see if there is a better place to attack and move to that spot
                 *
                 * }*/
                return(new MiniAttack()
                {
                    type = "AOEAttack", attackLocation = attackHex.Position
                });
            }
        }
        else if (gameState.selfChar.characterclass == CharacterClass.PSYONIC)
        {
            Character needestChar     = null;
            Character cantReachChar   = null;
            float     cantReachHealth = 1;
            float     leastHealth     = 1;
            foreach (Character character in gameState.aiChars)
            {
                if (character.CompareTo(gameState.selfChar) != 0)
                {
                    int   distance = htc.FindHexDistance(gameState.selfChar.gameCharacter.position, character.gameCharacter.position);
                    float health   = character.stats.health / character.stats.maxHealth;
                    //If you can heal the character, and the health is less than 1
                    if (health < leastHealth)
                    {
                        if (distance <= attackRadius)
                        {
                            leastHealth = health;
                            needestChar = character;
                        }
                        else
                        {
                            cantReachHealth = health;
                            cantReachChar   = character;
                        }
                    }
                }
            }
            if (leastHealth < 1)
            {
                return(new MiniAttack()
                {
                    type = "Attack", toAttack = needestChar
                });
            }
            else if (cantReachHealth < 1)
            {
                //If there is a character in need that you can't reach, move towards it
                Debug.Log("Healer Moving towards " + cantReachChar.name);
                HexTile toMovTo = MoveTowards(cantReachChar, gameState, htc, true);
                return(new MiniMove()
                {
                    type = "Move", Dest = toMovTo
                });
            }
            else
            {
                //Can't heal yourself*******
                //Move towards the Ranger
                Character target = GetCharacter(gameState.aiChars, CharacterClass.RANGED);
                if (target != null)
                {
                    HexTile toMovTo = MoveTowards(target, gameState, htc, true);
                    return(new MiniMove()
                    {
                        type = "Move", Dest = toMovTo
                    });
                }
                target = GetCharacter(gameState.aiChars, CharacterClass.HACKER);
                if (target != null)
                {
                    HexTile toMovTo = MoveTowards(target, gameState, htc, true);
                    return(new MiniMove()
                    {
                        type = "Move", Dest = toMovTo
                    });
                }
                target = GetCharacter(gameState.aiChars, CharacterClass.MELEE);
                if (target != null)
                {
                    HexTile toMovTo = MoveTowards(target, gameState, htc, true);
                    return(new MiniMove()
                    {
                        type = "Move", Dest = toMovTo
                    });
                }
                //No other characters but you exist, await the sweet release of death
                return(new MiniMove()
                {
                    type = "Move", Dest = gameState.selfTile
                });
            }
        }
        else
        {
            Character weakestChar = null;
            Character deadChar    = null;
            float     leastHealth = int.MaxValue;
            foreach (Character character in gameState.playerChars)
            {
                int distance = htc.FindHexDistance(gameState.selfChar.gameCharacter.position, character.gameCharacter.position);

                if (distance <= attackRadius)
                {
                    //If your attack would kill this character, target this one above all else
                    if ((Mathf.Max(0, character.stats.health - gameState.selfChar.stats.attackdmg) / character.stats.maxHealth) <= 0)
                    {
                        deadChar = character;
                    }
                    if ((character.stats.health / character.stats.maxHealth) < leastHealth)
                    {
                        leastHealth = (character.stats.health / character.stats.maxHealth);
                        weakestChar = character;
                    }
                }
            }
            //Attack the soon to be dead character if it can
            if (deadChar != null)
            {
                return(new MiniAttack()
                {
                    type = "Attack", toAttack = deadChar
                });
            }
            if (weakestChar != null)
            {
                return(new MiniAttack()
                {
                    type = "Attack", toAttack = weakestChar
                });
            }
        }

        // **** Spencer Notes ******

        /* Could not find anything to attack so move to the best possible location
         */

        List <HexTile>               possibleMoves  = htc.FindRadius(gameState.selfTile, gameState.selfChar.stats.speed);
        List <Character>             allChars       = gameState.aiChars.Concat(gameState.playerChars).ToList();
        List <(HexTile, List <int>)> possibleMoves2 = ValidateRadius(gameState.selfTile, possibleMoves, gameState.selfChar.stats.speed, allChars, htc);

        //possibleMoves = ValidateRadius(gameState.selfTile, possibleMoves, gameState.selfChar.stats.speed, allChars, htc);
        possibleMoves = new List <HexTile>();
        foreach ((HexTile hex, List <int> path) in possibleMoves2)
        {
            possibleMoves.Add(hex);
        }
        PriorityQueue fringe = new PriorityQueue();

        foreach (HexTile hex in possibleMoves)
        {
            GameState gs = new GameState(gameState.aiChars, gameState.playerChars, hex, gameState.selfChar);
            fringe.Push((hex, null), EvaluateState(gs, htc));
        }

        if (!fringe.HasNext())
        {
            //No avialable moves, move to self
            return(new MiniMove()
            {
                type = "Move", Dest = gameState.selfTile
            });
        }
        (HexTile state, List <int> actions) = fringe.Pop();
        return(new MiniMove()
        {
            type = "Move", Dest = state
        });
    }
示例#43
0
    public static HexTile MoveTowards(Character target, GameState gameState, HexTileController htc, bool runFromEnemy = false)
    {
        //choose the tile you want to move to, either the character directly, or a tile next to the character that is away from the enemy
        HexTile targetTile = htc.FindHex(target.gameCharacter.position);

        if (runFromEnemy)
        {
            List <HexTile> tilesAroundTarget = htc.FindRadius(targetTile, 1);
            int            farthest          = 0;
            foreach (HexTile hexTile in tilesAroundTarget)
            {
                if (!hexTile.IsObstacle && hexTile.HoldingObject == null)
                {
                    //Find distance to all player characters
                    int newDist = 0;
                    foreach (Character c in gameState.playerChars)
                    {
                        newDist += htc.FindHexDistance(hexTile.Position, c.gameCharacter.position);
                    }
                    //You want the distance to the player to be largest
                    if (newDist > farthest)
                    {
                        farthest   = newDist;
                        targetTile = hexTile;
                    }
                }
            }
        }
        List <int> moves = GreedySearch(gameState.selfTile, targetTile, htc);

        //If run from enemy is false, your target in ON a character, so remove that last step
        if (!runFromEnemy)
        {
            //Remove the last step (the one on the distination character)
            if (moves.Count > 0)
            {
                moves.RemoveAt(moves.Count - 1);
            }
        }

        Debug.Log("Psyonic wants to move ...");
        foreach (int i in moves)
        {
            Debug.Log(i);
        }
        Debug.Log("To get to " + target.name);

        //If you were already right next to the target, don't go anywhere
        if (moves.Count == 0)
        {
            return(gameState.selfTile);
        }
        //Only keep the number of steps that you are allowed to move
        //Starting hex is your own
        HexTile hex = gameState.selfTile;

        //Repet until you hit your step count, or you run out of moves
        for (int i = 0; i < Mathf.Min(gameState.selfChar.stats.speed, moves.Count); i++)
        {
            //Get the neighbor that the path tells you too
            hex = hex.nexts[moves[i]];
        }
        return(hex);
    }
示例#44
0
文件: Pathfinder.cs 项目: gelum/TBA
    private HexTile lastProcessedDestination; // keep track of last looked for destination tile

    #endregion Fields

    #region Methods

    //        Support methods for pathfinding
    // Heuristic method to help with pruning in A* algorithm.
    // Compute the cube coord distance between both tiles, and use that for heuristics.
    public static int Heuristic(HexTile a, HexTile b)
    {
        return (int) ((Math.Abs (a.cubeCoord.x - b.cubeCoord.x) + Math.Abs (a.cubeCoord.y - b.cubeCoord.y)
                + Math.Abs (a.cubeCoord.z - b.cubeCoord.z)) / 2);
    }
示例#45
0
    //Build random group from editor Chapter
    void BuildRandomFromChapter(Chapter c)
    {
        //Debug.Log( "BuildRandomFromChapter" );
        List <Transform> usedPositions = new List <Transform>();

        tileManager = Object.FindObjectOfType <TileManager>();
        chapter     = c;
        tileList    = new List <Tile>();
        //randomTileIndices = GlowEngine.GenerateRandomNumbers( chapter.randomTilePool.Count );

        //Debug.Log( "(RANDOM)FOUND " + chapter.randomTilePool.Count + " TILES" );
        //Debug.Log( "RANDOM ROOT INDEX: " + randomTileIndices[0] );

        //create the parent container
        containerObject      = new GameObject().transform;
        containerObject.name = "TILEGROUP: ";

        Tile previous = null;

        for (int i = 0; i < c.tileObserver.Count; i++)
        {
            //HexTile hexroot = new HexTile( chapter.randomTilePool[randomTileIndices[i]], new Vector(), RandomAngle() );
            //HexTile hexroot = new HexTile( randomTiles[i], new Vector(), RandomAngle() );

            HexTile hexroot = (HexTile)c.tileObserver[i];
            hexroot.vposition = new Vector3();
            hexroot.angle     = RandomAngle();

            //provide OnExplore trigger for random tile?
            //HexTile hexroot = new HexTile();
            //create parent object for prefab tile
            GameObject go = new GameObject();
            go.name = hexroot.idNumber.ToString();
            //instantiate the tile prefab
            string side = hexroot.tileSide == "Random" ? (Random.Range(1, 101) < 50 ? "A" : "B") : hexroot.tileSide;
            Tile   tile = Object.Instantiate(tileManager.GetPrefab(side, hexroot.idNumber), go.transform).GetComponent <Tile>();
            //Tile tile = tileManager.GetPrefab( side, hexroot.idNumber );
            //set its data
            //tile.Init();
            tile.gameObject.SetActive(false);
            //tile.transform.parent = go.transform;
            //tile.transform.localPosition = Vector3.zero;
            tile.hexTile   = hexroot;
            tile.tileGroup = this;
            tile.chapter   = c;
            //rotate go object
            tile.transform.parent.localRotation = Quaternion.Euler(0, hexroot.angle, 0);
            //set go's parent
            tile.transform.parent.transform.parent = containerObject;
            containerObject.name += " " + hexroot.idNumber.ToString();
            if (previous != null)
            {
                tile.AttachTo(previous, this);
            }
            tileList.Add(tile);
            previous = tile;

            //add fixed tokens
            if (tile.hexTile.tokenList.Count > 0)
            {
                usedPositions.AddRange(AddFixedToken(tile));
            }

            if (hexroot.isStartTile)
            {
                startPosition   = tile.GetChildren("token attach")[0].position.Y(.26f);
                tile.isExplored = true;
            }
        }

        //add random tokens
        if (c.usesRandomGroups)
        {
            AddRandomTokens(usedPositions.ToArray());
        }

        //***start tile cannot be random, below is no longer needed
        //find starting position if applicable
        //if ( c.dataName == "Start" )
        //{
        //	bool found = false;
        //	foreach ( var randomTile in tileList )
        //	{
        //		var positions = randomTile.GetChildren( "token attach" );
        //		var tokens = randomTile.GetChildren( " Token(Clone)" );

        //		var open = from p in positions
        //							 from t in tokens
        //							 let foo = new { p, t }
        //							 where Vector3.Distance( foo.p.position.Y( 0 ), foo.t.position.Y( 0 ) ) > 1f
        //							 select foo;

        //		if ( open.Count() > 0 )
        //		{
        //			Debug.Log( "placed starting position" );
        //			startPosition = open.First().p.position.Y( .26f );
        //			found = true;
        //			randomTile.hexTile.isStartTile = true;
        //			Colorize( true );
        //			break;
        //		}
        //	}
        //	if ( !found )
        //	{
        //		Debug.Log( "Starting position not found, using default" );
        //		int tid = GlowEngine.GenerateRandomNumbers( tileList.Count )[0];
        //		startPosition = tileList[tid].GetExploretokenPosition();
        //		tileList[tid].hexTile.isStartTile = true;
        //		Colorize( true );
        //	}
        //}

        GenerateGroupCenter();
    }
示例#46
0
        private void HandleMovingToNewTile(HexTile clickedTile, int attackAmount)
        {
            bool isEnemyTile = !clickedTile.IsEmpty() &&
                               currentPlayer.Index != clickedTile.Data.PlayerIndex;

            bool isFull = attackAmount == selectedTile.Amount;

            if (isFull)
            {
                if (isEnemyTile)
                {
                    var enemy = players[clickedTile.Data.PlayerIndex];

                    if (attackAmount > clickedTile.Amount)
                    {
                        int difference = attackAmount - clickedTile.Amount;
                        clickedTile.Player = currentPlayer;
                        clickedTile.Amount = difference;

                        selectedTile.Amount = 1;

                        currentPlayer.TilesCount++;
                        enemy.TilesCount--;

                        selectedTile = clickedTile;

                        pointer.Activate(selectedTile.transform.position);
                    }
                    else if (attackAmount == clickedTile.Amount)
                    {
                        bool attackerWin = UnityEngine.Random.Range(0, 2) == 0;

                        if (attackerWin)
                        {
                            enemy.TilesCount--;

                            selectedTile.Amount = 1;

                            clickedTile.Player = currentPlayer;
                            clickedTile.Amount = 1;

                            currentPlayer.TilesCount++;
                        }
                        else
                        {
                            enemy.TilesCount++;

                            selectedTile.Player = enemy;
                            selectedTile.Amount = 1;

                            clickedTile.Amount = 1;

                            currentPlayer.TilesCount--;
                        }

                        selectedTile = null;

                        pointer.Deactivate();
                    }
                    else if (attackAmount < clickedTile.Amount)
                    {
                        int difference = Mathf.Abs(attackAmount - clickedTile.Amount);

                        selectedTile.Amount = 0;
                        selectedTile.Player = null;

                        clickedTile.Amount = difference;

                        selectedTile = null;

                        currentPlayer.TilesCount--;

                        pointer.Deactivate();
                    }
                }
                else
                {
                    int newAmount = attackAmount - 1;

                    clickedTile.Player = currentPlayer;
                    clickedTile.Amount = newAmount;

                    selectedTile.Amount = 1;
                    selectedTile        = clickedTile;
                    currentPlayer.TilesCount++;

                    if (clickedTile.Amount > 1)
                    {
                        pointer.Activate(selectedTile.transform.position);
                    }
                    else
                    {
                        pointer.Deactivate();
                    }
                    //circle.position = clickedTile.Amount > 1 ? clickedTile.transform.position : new Vector3(20, 20);
                }
            }
            else
            {
                if (attackAmount >= clickedTile.Amount)
                {
                    clickedTile.Player = currentPlayer;

                    int difference = Math.Max(1, attackAmount - clickedTile.Amount);
                    clickedTile.Amount = difference;
                }
                else if (attackAmount < clickedTile.Amount)
                {
                    clickedTile.Amount -= attackAmount;
                }

                selectedTile.Amount -= attackAmount;
            }

            CheckPlayerWin();
        }
示例#47
0
    public void CreateTerrain()
    {
        Clear();

        Terrain terrain = GetComponent <Terrain>();

        width  = (int)((terrain.terrainData.size.x - 2 * border) / _tileSize);
        height = (int)((terrain.terrainData.size.z - 2 * border) / (0.866025404f * _tileSize));

        tiles = new HexTile[width * height];

        tileWidth     = instance._tileSize;
        tileHeight    = 0.75f * instance._tileSize / 0.866025404f;
        tileHalfWidth = instance._tileSize / 2.0f;
        tileC         = tileHeight / 4.0f;
        tileM         = tileC / tileHalfWidth;

        float scale = _tileSize / (hexTextureWidth / 100.0f);

        int indexCounter = 0;

        for (int z = 0; z < height; z++)
        {
            for (int x = 0; x < width - (z % 2); x++)
            {
                HexTile hexTile      = Instantiate(hexTilePrefab);
                Vector3 tilePosition = new Vector3(border + 0.5f * _tileSize +
                                                   _tileSize * x + 0.5f * _tileSize * (z % 2),
                                                   0.0f,
                                                   z * _tileSize * 0.866025404f + border + 0.5f * _tileSize * (1.0f / 0.866025404f));

                hexTile.x     = x;
                hexTile.y     = z;
                hexTile.index = indexCounter++;
                hexTile.transform.SetParent(transform);
                hexTile.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
                hexTile.transform.localPosition    = tilePosition;
                hexTile.gameObject.isStatic        = true;

                hexTile.GetComponent <LineHexagon>().thickness = lineThickness;
                hexTile.GetComponent <LineHexagon>().scale     = _tileSize;
                hexTile.GetComponent <LineHexagon>().CreateMesh();
                // hexTile.gameObject.hideFlags = HideFlags.HideInHierarchy;

                Ray tileRay    = new Ray(hexTile.transform.position + sampleHeight * Vector3.up, Vector3.down);
                int layer_mask = LayerMask.GetMask("Terrain");

                RaycastHit info;

                if (Physics.Raycast(tileRay, out info, 1000.0f, layer_mask))
                {
                    hexTile.transform.position = new Vector3(hexTile.transform.position.x,
                                                             terrain.transform.position.y + sampleHeight - info.distance, hexTile.transform.position.z);
                }
                else
                {
                    hexTile.isOccluded = true;
                }

                // hexTile.GetComponent<SpriteRenderer>().sprite = spriteHexTileSolid;

                tiles[z * width + x] = hexTile;
            }
        }

        findNeighbors();

        DisableOccluded();
    }
示例#48
0
文件: Pathfinder.cs 项目: gelum/TBA
    // Rechables pseudocode
    /*
    function cube_reachable(start, movement):
        var visited = set()
        add start to visited
        var fringes = []
        fringes.append([start])

        for each 1 < k ≤ movement:
            fringes.append([])
            for each cube in fringes[k-1]:
                for each 0 ≤ dir < 6:
                    var neighbor = cube_neighbor(cube, dir)
                    if neighbor not in visited, not blocked:
                        add neighbor to visited
                        fringes[k].append(neighbor)

        return visited
     */
    public ArrayList reachables( Moveable peep, HexTile root)
    {
        ArrayList visited = new ArrayList ();					// list of visited noted
        visited.Add (root);										// add root for obvious reasons
        ArrayList fringes = new ArrayList ( peep.range + 1);	// list of lists
                                                                // fringes[k] = all nodes reachable in k
        fringes.Add (new ArrayList() { root});					// add [ root] to fringes[ 0]

        for (int i = 1; i <= peep.range; i++) {
            fringes.Add( new ArrayList());
            foreach( HexTile tile in (ArrayList)fringes[ i-1])
            {
                foreach( GameObject neighbourGO in tile.Neighbours( peep))
                {
                    HexTile neighbour = neighbourGO.GetComponent<HexTile>();
                    if ( !visited.Contains( neighbour))
                    {
                        visited.Add ( neighbour);
                        ((ArrayList) fringes[ i]).Add(neighbour);
                    }
                }
            }
        }

        return visited;
    }
示例#49
0
 internal static List <HexTile> GetTilesInRange(HexTile tile, int range, bool includeSelf = true)
 {
     return(GetTilesInRange(tile.x, tile.y, range, includeSelf));
 }
示例#50
0
    /*
     * Randomly choose a tile from a specific
     * biome, and mark it as a city
     * */
    void PlaceCityOnBiomeTile(List <HexTile> biomeTiles)
    {
        List <HexTile> cityPlacableBiomeTile = new List <HexTile>();

        if (tilesElligibleForCities.Count <= 0)
        {
            cityCount = cities.Count;
            Debug.LogError("There are no more elligible tiles to put a city on!");
        }

        //check if this biome still has city placable tiles
        for (int i = 0; i < biomeTiles.Count; i++)
        {
            if (tilesElligibleForCities.Contains(biomeTiles[i]))
            {
                cityPlacableBiomeTile.Add(biomeTiles [i]);
            }
        }

        if (cityPlacableBiomeTile.Count <= 0)
        {
            //if this point is reached, it means no more tiles in the current biome are available, place a random one anywhere
            int     randomTileIndex = UnityEngine.Random.Range(0, tilesElligibleForCities.Count);
            HexTile chosenTile      = tilesElligibleForCities [randomTileIndex];
            SetTileAsCity(chosenTile);
            HexTile[] neighborTiles = chosenTile.GetTilesInRange(minCityDistance);
            for (int i = 0; i < neighborTiles.Length; i++)
            {
                if (tilesElligibleForCities.Contains(neighborTiles [i]))
                {
                    //Remove all neighbor tiles from elligible tiles
                    tilesElligibleForCities.Remove(neighborTiles [i]);
                }
            }
            tilesElligibleForCities.Remove(chosenTile);
            return;
        }

        bool choosingCity = true;

        while (choosingCity)
        {
            //Choose random tile from city placable biome tiles
            int     randomTileIndex = UnityEngine.Random.Range(0, cityPlacableBiomeTile.Count);
            HexTile chosenTile      = cityPlacableBiomeTile[randomTileIndex];
            //check if chosen tile is elligible for city placement
            if (tilesElligibleForCities.Contains(chosenTile))
            {
                choosingCity = false;
                SetTileAsCity(chosenTile);

                HexTile[] neighborTiles = chosenTile.GetTilesInRange(minCityDistance);
                for (int i = 0; i < neighborTiles.Length; i++)
                {
                    if (tilesElligibleForCities.Contains(neighborTiles [i]))
                    {
                        //Remove all neighbor tiles from elligible tiles
                        tilesElligibleForCities.Remove(neighborTiles [i]);
                    }
                }
                tilesElligibleForCities.Remove(chosenTile);
            }
        }
    }
 public PlaceCharacterAction(HexTile targetTile, Character characterToPlace)
 {
     this.targetTile       = targetTile;
     this.characterToPlace = characterToPlace;
 }
	private void InitiateInteraction (HexTile init, HexTile rec) {
		Weapon iWep = init.character.GetComponentInChildren<Weapon> ();
		Stats iStat = init.character.GetComponentInChildren<Stats> ();
		Stats rStat = rec.character.GetComponentInChildren<Stats> ();

		if (iWep.type%2==1) {
			rStat.cHP += iWep.Mt + iStat.Mag;
			if (rStat.cHP > rStat.mHP) {
				rStat.cHP = rStat.mHP;
			}
			iStat.Xp += iWep.Mt;
		}
	}
示例#53
0
 public abstract void Idle();                                //Do nothing
 public abstract void Move(HexTile startTile);               //Just move along given path
	public void InitiateBattle (HexTile attacker, HexTile defender) {
		Weapon aWep = attacker.character.GetComponentInChildren<Weapon> ();
		Weapon dWep = defender.character.GetComponentInChildren<Weapon> ();
		Stats aStat = attacker.character.GetComponentInChildren<Stats> ();
		Stats dStat = defender.character.GetComponentInChildren<Stats> ();

		float a_as, d_as;
		if (aWep.Wt <= aStat.Str) {
			a_as = aStat.Spd;
		} else {
			a_as = aStat.Spd - (aWep.Wt - aStat.Str);
		}

		if (dWep.Wt <= dStat.Str) {
			d_as = dStat.Spd;
		} else {
			d_as = dStat.Spd - (dWep.Wt - dStat.Str);
		}

		int[] repAtt = {0,0};
		if (a_as - d_as >= 4) {
			repAtt [0] = 1;
		} else if (d_as - a_as >= 4) {
			repAtt [1] = 1;
		}

		float a_hr, d_hr;
		a_hr = aWep.Hit + aStat.Skl * 2 + aStat.Lck;
		d_hr = dWep.Hit + dStat.Skl * 2 + aStat.Lck;

		float a_ev, d_ev;
		a_ev = a_as + aStat.Lck + attacker.terrainBonus;
		d_ev = d_as + dStat.Lck + defender.terrainBonus;

		float a_ac, d_ac;
		a_ac = a_hr - d_ev;
		if (a_ac < 0) {
			a_ac = 0;
		} else if (a_ac > 100) {
			a_ac = 100;
		}
		d_ac = d_hr - a_ev;
		if (d_ac < 0) {
			d_ac = 0;
		} else if (d_ac > 100) {
			d_ac = 100;
		}

		float a_ap, d_ap;
		if (aWep.type%2 == 0) {
			a_ap = aStat.Str + (aWep.Mt);
		} else {
			a_ap = aStat.Mag + (aWep.Mt);
		}
		if (dWep.type%2 == 0) {
			d_ap = dStat.Str + (dWep.Mt);
		} else {
			d_ap = dStat.Mag + (dWep.Mt);
		}

		float a_dp, d_dp;
		if (dWep.type%2 == 0) {
			a_dp = attacker.terrainBonus + aStat.Def;
		} else {
			a_dp = attacker.terrainBonus + aStat.Res;
		}
		if (aWep.type%2 == 0) {
			d_dp = defender.terrainBonus + dStat.Def;
		} else {
			d_dp = defender.terrainBonus + dStat.Res;
		}

		float a_dm, d_dm;
		a_dm = a_ap - d_dp;
		d_dm = d_ap - a_dp;
		if (a_dm < 0) {
			a_dm = 0;
		}
		if (d_dm < 0) {
			d_dm = 0;
		}

		float a_cr, d_cr;
		a_cr = aWep.Crit + aStat.Skl / 2;
		d_cr = dWep.Crit + dStat.Skl / 2;

		float a_ce, d_ce;
		a_ce = aStat.Lck;
		d_ce = dStat.Lck;

		float a_cc, d_cc;
		a_cc = a_cr - d_ce;
		d_cc = d_cr - a_ce;

		float a_xp, d_xp;

		if (attacker.character.tag == "Unit") {
			battleAnimation [0] = 1;
		} else {
			battleAnimation [0] = 2;
		}

		float x = Random.Range(0,100);
		if (a_cc>=x) {
			a_dm = a_dm * 3;
		}
		if (a_ac >= x) {
			battleAnimation [1] = 1;

			if (a_dm == 0) {
				a_xp = 1;
			} else {
				float xp = 10 + (dStat.Lv - aStat.Lv) / 2;
				if (xp < 1) {
					xp = 1;
				}
				a_xp = xp;
			}

			battleAnimation [2] = (int)a_dm;
			dStat.cHP -= a_dm;
		} else {
			battleAnimation [1] = 0;
			a_xp = 1;
		}

		if (dStat.cHP <= 0) {
			battleAnimation [3] = -1;

			a_xp += (dStat.Lv - aStat.Lv) + 15 + 5;
			if (defender.character.CompareTag ("Enemy")) {
				a_xp += 40 * defender.character.GetComponent<Enemy> ().special;
			}
			UpdateXp (aStat,a_xp,dStat,0);
			return;
		}

		if (dWep.Rng.Contains (defender.att_dis)) {
			if (defender.character.tag == "Unit") {
				battleAnimation [3] = 1;
			} else {
				battleAnimation [3] = 2;
			}
		} else {
			battleAnimation [3] = 0;
		}

		x = Random.Range(0,100);
		if (d_cc>=x) {
			d_dm = d_dm * 3;
		}
		if (d_ac >= x && dWep.Rng.Contains (defender.att_dis) && dWep.type >= 0) {
			battleAnimation [4] = 1;

			if (d_dm == 0) {
				d_xp = 1;
			} else {
				float xp = 10 + (aStat.Lv - dStat.Lv) / 2;
				if (xp < 1) {
					xp = 1;
				}
				d_xp = xp;
			}

			battleAnimation [5] = (int)d_dm;
			aStat.cHP -= d_dm;
		} else {
			battleAnimation [4] = 0;
			d_xp = 1;
		}

		if (aStat.cHP <= 0) {
			battleAnimation [6] = -1;
			d_xp += (aStat.Lv - dStat.Lv) + 15 + 5;
			if (attacker.character.CompareTag ("Enemy")) {
				d_xp += 40 * attacker.character.GetComponent<Enemy> ().special;
			}
			UpdateXp (aStat,a_xp,dStat,d_xp);
			return;
		}

		int offset = 3;
		if (battleAnimation [3] == 0) {
			offset = 0;
		}

		if (repAtt[0] == 1) {
			if (attacker.character.tag == "Unit") {
				battleAnimation [3+offset] = 1;
			} else {
				battleAnimation [3+offset] = 2;
			}

			x = Random.Range(0,100);
			if (a_cc>=x) {
				a_dm = a_dm * 3;
			}
			if (a_ac >= x) {
				battleAnimation [4 + offset] = 1;

				if (a_dm == 0) {
					a_xp += 1;
				} else {
					float xp = 10 + (dStat.Lv - aStat.Lv) / 2;
					if (xp < 1) {
						xp = 1;
					}
					a_xp += xp;
				}

				battleAnimation [5 + offset] = (int)a_dm;
				dStat.cHP -= a_dm;
			} else {
				battleAnimation [4 + offset] = 0;
				a_xp += 1;
			}

			if (dStat.cHP <= 0) {
				battleAnimation [6 + offset] = -1;
				a_xp += (dStat.Lv - aStat.Lv) + 15 + 5;
				if (defender.character.CompareTag ("Enemy")) {
					a_xp += 40 * defender.character.GetComponent<Enemy> ().special;
				}
				UpdateXp (aStat,a_xp,dStat,d_xp);
				return;
			}
		} else if (repAtt[1] == 1) {
			if (dWep.Rng.Contains (defender.att_dis)) {
				if (defender.character.tag == "Unit") {
					battleAnimation [3 + offset] = 1;
				} else {
					battleAnimation [3 + offset] = 2;
				}
			} else {
				battleAnimation [3 + offset] = 0;
			}

			x = Random.Range(0,100);
			if (d_cc>=x) {
				d_dm = d_dm * 3;
			}
			if (d_ac >= x && dWep.Rng.Contains (defender.att_dis) && dWep.type >= 0) {
				battleAnimation [4 + offset] = 1;

				if (d_dm == 0) {
					d_xp += 1;
				} else {
					float xp = 10 + (aStat.Lv - dStat.Lv) / 2;
					if (xp < 1) {
						xp = 1;
					}
					d_xp += xp;
				}

				battleAnimation [5 + offset] = (int)d_dm;
				aStat.cHP -= d_dm;
			} else {
				battleAnimation [4 + offset] = 0;
				d_xp += 1;
			}

			if (aStat.cHP <= 0) {
				battleAnimation [6 + offset] = -1;
				d_xp += (aStat.Lv - dStat.Lv) + 15 + 5;
				if (attacker.character.CompareTag ("Enemy")) {
					d_xp += 40 * defender.character.GetComponent<Enemy> ().special;
				}
				UpdateXp (aStat,a_xp,dStat,d_xp);
				return;
			}
		}

		UpdateXp (aStat,a_xp,dStat,d_xp);
	}
示例#55
0
 public void SetMercenaryTask(MercenaryData pMercenary, TaskType pTaskType, HexTile pTile)
 {
 }
示例#56
0
 internal void MakeCitizenMove(HexTile startTile, HexTile targetTile)
 {
     this.transform.position = Vector3.MoveTowards(startTile.transform.position, targetTile.transform.position, 0.5f);
 }
示例#57
0
 public void SetTile(Point2 pos, HexTile tile)
 {
     tiles[pos.x + (pos.y * _boardWidth)] = tile;
 }
示例#58
0
    //Build fixed group from editor Chapter
    void BuildFixedFromChapter(Chapter c)
    {
        //Debug.Log( "BuildFixedFromChapter" );
        List <Transform> usedPositions = new List <Transform>();

        tileManager = Object.FindObjectOfType <TileManager>();
        chapter     = c;
        tileList    = new List <Tile>();

        //Debug.Log( "(FIXED)FOUND " + chapter.tileObserver.Count + " TILES" );

        //create the parent container
        containerObject      = new GameObject().transform;
        containerObject.name = "TILEGROUP: ";

        for (int i = 0; i < c.tileObserver.Count; i++)
        {
            //Debug.Log( chapter.tileObserver[i].idNumber );

            HexTile h = chapter.tileObserver[i] as HexTile;
            containerObject.name += " " + h.idNumber.ToString();
            GameObject goc = new GameObject();
            goc.name = h.idNumber.ToString();

            Tile tile = Object.Instantiate(tileManager.GetPrefab(h.tileSide, h.idNumber), goc.transform).GetComponent <Tile>();
            //Tile tile = tileManager.GetPrefab( h.tileSide, h.idNumber );
            //set its data
            //tile.Init();
            tile.gameObject.SetActive(false);
            //tile.transform.parent = goc.transform;
            //tile.transform.localPosition = Vector3.zero;
            tile.chapter   = c;
            tile.hexTile   = h;
            tile.tileGroup = this;
            if (i > 0)
            {
                //3D distance between tiles in X = 0.75
                //3D distance between tiles in Y = 0.4330127

                //EDITOR distance between hextile centers = 55.425626
                //3D distance between hextile centers = .8660254
                float d = Vector3.Distance(tile.hexTile.vposition, tileList[0].hexTile.vposition);
                //Debug.Log( "DIST:" + d );//x48, y27.71281
                float scalar = .8660254f * d;
                scalar = scalar / 55.425626f;
                //Debug.Log( "SCALAR:" + scalar );//x48, y27.71281

                //get normalized EDITOR vector to first tile in this group
                Vector3 offset = tile.hexTile.vposition - tileList[0].hexTile.vposition;
                //convert normalized EDITOR vector to 3D using distance tween hexes
                Vector3 n = Vector3.Normalize(offset) * scalar;
                //Debug.Log( "offset::" + goc.name + "::" + n );

                //reflect to account for difference in coordinate systems quadrant (2D to 3D)
                n = Vector3.Reflect(n, new Vector3(0, 0, 1));

                //fix tile positions that don't have editor root hex at 0,1
                Vector3 tilefix = Vector3.zero;
                //convert the string to vector2
                string[] s = tile.hexTile.hexRoot.Split(',');
                Vector2  p = new Vector2(float.Parse(s[0]), float.Parse(s[1]));
                if (p.y != 1)
                {
                    tilefix = new Vector3(0, 0, -.4330127f * (p.y - 1f));
                }
                if (p.x != 0)
                {
                    tilefix = new Vector3(p.x * .75f, 0, 0);
                }

                //set tile position using goc's position + reflected offset
                tile.SetPosition(tileList[0].transform.parent.transform.position + n + tilefix, h.angle);
                //Debug.Log( "ROOTPOS:" + tile.rootPosition.transform.position );
                //Debug.Log( "ROOT::" + tileList[0].transform.parent.transform.position );
            }
            else
            {
                //fix tile positions that don't have editor root hex at 0,1
                Vector3 tilefix = Vector3.zero;
                //convert the string to vector2
                string[] s = tile.hexTile.hexRoot.Split(',');
                Vector2  p = new Vector2(float.Parse(s[0]), float.Parse(s[1]));
                if (p.y != 1)
                {
                    tilefix = new Vector3(0, 0, -.4330127f * (p.y - 1f));
                }
                if (p.x != 0)
                {
                    tilefix = new Vector3(p.x * .75f, 0, 0);
                }
                tile.SetPosition(Vector3.zero, h.angle);
                tile.transform.position += tilefix;
            }

            tileList.Add(tile);
            //set parent of goc
            tile.transform.parent.transform.parent = containerObject;
            //add a token, if there is one
            //if ( !c.usesRandomGroups )
            if (tile.hexTile.tokenList.Count > 0)
            {
                usedPositions.AddRange(AddFixedToken(tile));
            }

            //find starting position if applicable
            if (h.isStartTile)
            {
                tile.isExplored = true;
                startPosition   = tile.GetChildren("token attach")[0].position.Y(.26f);
            }
        }

        //add random tokens
        if (c.usesRandomGroups && usedPositions.Count > 0)
        {
            AddRandomTokens(usedPositions.ToArray());
        }

        GenerateGroupCenter();
    }
示例#59
0
    private void Update()
    {
        SelectedTile = null;

        if (Physics.Raycast(source.ViewportPointToRay(new Vector2(0.5F, 0.5F)), out RaycastHit hitInfo) && GameManager.Instance.Phase == GamePhase.BUILD)
        {
            if (hitInfo.collider.CompareTag("Tile") || hitInfo.collider.CompareTag("Tower"))
            {
                SelectedTile = hitInfo.collider.GetComponentInParent <HexTile>();
                SelectedTile?.Ping();
            }
        }

        if (hoveredTowerDisplay)
        {
            if (hitInfo.collider && hitInfo.collider.CompareTag("Tower"))
            {
                TowerBase t = hitInfo.collider.GetComponent <TowerBase>();

                if (!t && hoveredTowerDisplay.transform.parent.gameObject.activeInHierarchy)
                {
                    hoveredTowerDisplay.transform.parent.gameObject.SetActive(false);
                }

                if (t)
                {
                    if (!hoveredTowerDisplay.transform.parent.gameObject.activeInHierarchy)
                    {
                        hoveredTowerDisplay.transform.parent.gameObject.SetActive(true);
                    }

                    hoveredTowerDisplay.Load(t);
                    hoveredTowerDisplay.transform.parent.position = hitInfo.point + hoverDisplayOffset;
                    hoveredTowerDisplay.transform.parent.forward  = -hitInfo.normal;
                }
            }
            else if (hoveredTowerDisplay.transform.parent.gameObject.activeInHierarchy)
            {
                hoveredTowerDisplay.transform.parent.gameObject.SetActive(false);
            }
        }

        if (hoveredEnemyDisplay)
        {
            if (hitInfo.collider && hitInfo.collider.CompareTag("Enemy"))
            {
                Enemy e = hitInfo.collider.GetComponent <Enemy>();

                if (!e && hoveredEnemyDisplay.transform.parent.gameObject.activeInHierarchy)
                {
                    hoveredEnemyDisplay.transform.parent.gameObject.SetActive(false);
                }

                if (e)
                {
                    if (!hoveredEnemyDisplay.transform.parent.gameObject.activeInHierarchy)
                    {
                        hoveredEnemyDisplay.transform.parent.gameObject.SetActive(true);
                    }

                    hoveredEnemyDisplay.Load(e);
                    hoveredEnemyDisplay.transform.parent.position = hitInfo.point + hoverDisplayOffset;
                    hoveredEnemyDisplay.transform.parent.forward  = -hitInfo.normal;
                }
            }
            else if (hoveredEnemyDisplay.transform.parent.gameObject.activeInHierarchy)
            {
                hoveredEnemyDisplay.transform.parent.gameObject.SetActive(false);
            }
        }
    }
 public abstract bool CheckForEncounter(HexTile tile);