Exemple #1
0
    public void StruckedByLightning()
    {
        if (!IsEnabled)
        {
            return;
        }

        Setup();
        Debug.Log("Grass has been hit by Lightning!");
        GrassMaterial.color = Color.red;
        CurrentColor        = Color.red;
        FieldTile.ChangeState("Fire");
        isDefultEnableState = IsEnabled;
    }
Exemple #2
0
    public void RainedOn()
    {
        if (!IsEnabled)
        {
            return;
        }

        Setup();
        Debug.Log("Grass has been hit by Water!");
        GrassMaterial.color = Color.blue;
        CurrentColor        = Color.blue;
        FieldTile.ChangeState("Water");
        isDefultEnableState = IsEnabled;
    }
Exemple #3
0
        public ConnectionModule GetBestConnection(Module module, List <ConnectionModule> connectionModules, FieldTile[,] field)
        {
            FieldTile tile = GetClosestTileToModule(GetAdjacentTilesOfType(field, FieldTile.eTileType.Connection));

            foreach (ConnectionModule cm in connectionModules)
            {
                if (cm.Position.Equals(tile.Position))
                {
                    return(cm);
                }
            }

            return(null);
        }
        //TODO: Make gamefield observable for change

        public GameFieldTest()
        {
            placeableObjectMock  = Substitute.For <PlaceableObject>();
            fieldTileFactoryMock = Substitute.For <FieldTileFactory>();
            tileMock             = Substitute.For <FieldTile>();
            FieldTile[] tiles = new FieldTile[fieldSize];
            for (int i = 0; i < tiles.Length; i++)
            {
                tiles[i] = tileMock;
            }
            fieldTileFactoryMock.CreateTileList(fieldSize).Returns(tiles);

            testee = new ArrayTiledGameField(fieldSize, fieldTileFactoryMock);
        }
Exemple #5
0
    public void StruckedByLightning()
    {
        if (!IsEnabled)
        {
            return;
        }

        Setup();
        //If Fire is stuck by Lightning it should do nothing for now, unless it was hit by water first, then take it back to fire
        Debug.Log("Fire has been hit by Lightning!");
        FireMaterial.color = StartingColor;
        CurrentColor       = StartingColor;
        FieldTile.ChangeState("Fire");
        isDefultEnableState = IsEnabled;
    }
Exemple #6
0
    public void RainedOn()
    {
        if (!IsEnabled)
        {
            return;
        }

        Setup();
        //If Water has been hit by water then do nothing, unless it has been hit by Lightning first, then take it back to water
        Debug.Log("Water has been hit by Water!");
        WaterMaterial.color = StartingColor;
        CurrentColor        = StartingColor;
        FieldTile.ChangeState("Water");
        isDefultEnableState = IsEnabled;
    }
Exemple #7
0
        public FieldTile GetClosestTileToModule(List <FieldTile> tiles)
        {
            float     distance = float.MaxValue;
            FieldTile best     = null;

            foreach (FieldTile tile in tiles)
            {
                if (tile.GetDistanceToCenterOfModule(this) < distance)
                {
                    distance = tile.GetDistanceToCenterOfModule(this);
                    best     = tile;
                }
            }

            return(best);
        }
Exemple #8
0
        protected override void OnLoad()
        {
            TmxMap map = new TmxMap("Resources/farm.tmx");

            Size = new Vector2D(map.Width, map.Height);

            TmxTileset tileset = map.Tilesets[0];

            foreach (var layer in map.Layers)
            {
                int zIndex = int.Parse(layer.Properties["ZIndex"]);

                Tile[] tiles = layer.Tiles.Where(x => x.Gid > 0).Select(x => GetTile(x, tileset)).ToArray();

                AddTileLayer(new TileLayer(zIndex, tiles));
            }

            foreach (var field in map.ObjectGroups[0].Objects.Where(x => x.Name == "Field Block"))
            {
                int width  = (int)field.Width / map.TileWidth;
                int height = (int)field.Height / map.TileHeight;
                int x      = (int)field.X / map.TileWidth;
                int y      = (int)field.Y / map.TileHeight;

                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        FieldTile tile = new FieldTile();
                        tile.Position = new Vector2D(x + i, y + j);
                        AddGameObject(tile);
                    }
                }
            }

            var spawn = map.ObjectGroups[0].Objects["Spawn"];

            Farmer player = new Farmer();

            player.Position = new Vector2D((int)(spawn.X / map.TileWidth), (int)(spawn.Y / map.TileHeight));

            AddGameObject(player);
            AddGameObject(new MouseController());
            AddGameObject(new CameraController());

            Game.CenterViewTo(player.Position);
        }
Exemple #9
0
        private FieldTile CreateXMove(Sequence sq, float xDiff, FieldTile tile)
        {
            if (Math.Abs(Mathf.Abs(xDiff) - 1) < float.Epsilon)
            {
                return(tile);
            }

            var targetTile = xDiff < 0 ? tile.LeftNeighbor : tile.RightNeighbor;

            if (targetTile.HasEnemy)
            {
                return(tile);
            }

            sq.Append(this.transform.DOMove(targetTile.transform.position.ClearZ() + this.transform.position.OnlyZ(),
                                            this.MoveTime));
            return(targetTile);
        }
Exemple #10
0
        private void CreateMovement(FieldTile target)
        {
            var tempPos = this.PositionTile;

            tempPos.HasEnemy = false;

            var mv = DOTween.Sequence();

            mv.PrependInterval(0.1f);

            var targetPos = target.transform.position;
            var distance  = Mathf.Abs(targetPos.x - this.transform.position.x) + Mathf.Abs(targetPos.y - this
                                                                                           .transform
                                                                                           .position.y);

            var distanceWalkable = this.movement;

            while (distanceWalkable > 0 && distance > this.MaxDistance + 1)
            {
                var toMove = target.transform.position.ClearZ() - tempPos.transform.position.ClearZ();

                //if (Mathf.Abs(toMove.x) >= Mathf.Abs(toMove.y))
                if (Random.Range(0f, 1f) <= 0.5f)
                {
                    if (Mathf.Abs(toMove.x) > float.Epsilon)
                    {
                        tempPos = this.CreateXMove(mv, toMove.x, tempPos);
                    }
                }
                else
                {
                    if (Mathf.Abs(toMove.y) > float.Epsilon)
                    {
                        tempPos = this.CreateYMove(mv, toMove.y, tempPos);
                    }
                }

                distanceWalkable--;
            }

            mv.OnComplete(() => { GameManager.Instance.Battlefield.EnemyCanMove = true; });
            this.PositionTile = tempPos;
            tempPos.HasEnemy  = true;
        }
Exemple #11
0
        public void Attack(FieldTile tile)
        {
            var mv  = DOTween.Sequence();
            var pos = this.transform.position;

            var dir = tile.transform.position - pos;

            dir.Normalize();

            var target = GameManager.Instance.Battlefield.Enemies.Find(e => e.PositionTile == tile);

            mv.Append(this.transform.DOMove(pos + 0.5f * dir, this.AttackTime))
            .Append(this.transform.DOMove(pos, this.AttackTime))
            .OnComplete(() =>
            {
                GameManager.Instance.BattleState =
                    BattleState.EnemiesMoving;
                GameManager.Instance.Battlefield
                .Enemies.Shuffle();
                GameManager.Instance.Battlefield
                .PlayerAttackable.Clear();

                var sq = DOTween.Sequence().AppendInterval(this.MoveTime * 2)
                         .AppendCallback(() =>
                {
                    GameManager.Instance.Battlefield.EnemyCanMove = true;
                });
            });

            var moveEnemy = DOTween.Sequence();

            if (target == null)
            {
                return;
            }

            var tarPos = target.transform.position;

            moveEnemy.AppendInterval(this.AttackTime)
            .AppendCallback(() => this.DealDamage(target))
            .Append(target.transform.DOMove(tarPos + 0.25f * dir, this.AttackTime))
            .Append(target.transform.DOMove(tarPos, this.AttackTime));
        }
    /// <summary>
    ///  Drop Rain on the current object we are clicking.
    ///  Using RayCasting for point of click
    ///  Using Interface to control behavior
    /// </summary>
    private void DropRain()
    {
        //Use Ray Casting to check for hit
        //Create ray
        Ray rayOrigin = Camera.main.ScreenPointToRay(Input.mousePosition);

        //Create hit info
        RaycastHit hitInfo;

        //Did we hit anything?
        if (Physics.Raycast(rayOrigin, out hitInfo))
        {
            //Grab the IDousable Interface ofthe object we hit
            FieldTile obj = hitInfo.collider.GetComponent <FieldTile>();

            //We hit a "Dousable" object
            if (obj != null)
            {
                obj.RainedOn();
            }
        }
    }
    /// <summary>
    ///  Fire Lighting on the current object we are clicking.
    ///  Using RayCasting for point of click
    ///  Using Interface to control behavior
    /// </summary>
    private void FireLightning()
    {
        //Use Ray Casting to check for hit
        //Create ray
        Ray rayOrigin = Camera.main.ScreenPointToRay(Input.mousePosition);

        //Create hit info
        RaycastHit hitInfo;

        //Did we hit anything?
        if (Physics.Raycast(rayOrigin, out hitInfo))
        {
            //Grab the IDousable Interface ofthe object we hit
            FieldTile obj = hitInfo.collider.GetComponent <FieldTile>();
            Debug.Log($"hitInfo.collider.name:  {hitInfo.collider.name}");
            Debug.Log($"obj:  {obj}");

            //We hit a "Attackable" object
            if (obj != null)
            {
                obj.StruckedByLightning();
            }
        }
    }
 public FieldTileTest()
 {
     objectToPlaceOnTile = Substitute.For <PlaceableObject>();
     testee = new BasicFieldTile();
 }
Exemple #15
0
    private static GameObject InstantiateFields(
        GameObject mapRoot,
        MeshFilter tilePool,
        FieldTile fieldPrototype,
        FieldTile verticalPrototype,
        FieldCollider fieldColliderPrototype,
        Action <Map, MeshFilter, int, int> onEachTile
        )
    {
        Map map = MapLoader.currentMap;

        mapRoot.isStatic = true;

        int fieldAspects = 4;
        int width        = map.width;

        int floors = (map.fields.Length > map.verticalFields.Length)
            ? map.fields.Length
            : map.verticalFields.Length;

        Dictionary <int, List <MeshFilter> > meshFilterDictionary         = new Dictionary <int, List <MeshFilter> >();
        Dictionary <int, List <MeshFilter> > verticalMeshFilterDictionary = new Dictionary <int, List <MeshFilter> >();

        // TODO: reduce draw call, RT? Mesh Combine?
        for (int floor = 0; floor < floors; floor++)
        {
            int[] floorField = (map.fields.Length > floor)
                ? map.fields[floor]
                : new int[] { };

            int[][] floorVerticalField = (map.verticalFields.Length > floor)
                ? map.verticalFields[floor]
                : new int[][] { };

            int indexes = (floorField.Length >= floorVerticalField.Length)
                ? floorField.Length
                : floorVerticalField.Length;

            for (int i = 0; i < indexes; i++)
            {
                int col = i % width;
                int row = (int)Mathf.Floor(i / width);

                do // collect MeshFilters of horizontal fields by same appearance
                {
                    if (floorField.Length <= i)
                    {
                        break;
                    }

                    int fieldId = floorField[i];
                    if (fieldId == MapLoader.EmptyField)
                    {
                        break;
                    }

                    MeshFilter filter = GameObject.Instantiate <MeshFilter>(tilePool);
                    filter.transform.parent   = mapRoot.transform.transform;
                    filter.transform.rotation = MapLoader.SurfaceUp;
                    filter.transform.position = new Vector3(col * FieldUnit.x + FieldUnit.x * 0.5f, (float)floor * FieldUnit.y, -row * FieldUnit.z - FieldUnit.z * 0.5f);

                    if (!meshFilterDictionary.ContainsKey(fieldId))
                    {
                        meshFilterDictionary.Add(fieldId, new List <MeshFilter> {
                        });
                    }

                    List <MeshFilter> filters = meshFilterDictionary[fieldId];
                    filters.Add(filter);
                    onEachTile?.Invoke(MapLoader.currentMap, filter, col, row);
                } while (false);

                do // collect MeshFilters of vertical fields by same appearance
                {
                    if (floorVerticalField.Length <= i)
                    {
                        break;
                    }

                    int[] verticalFieldDirections = floorVerticalField[i];
                    if (verticalFieldDirections.Length != fieldAspects)
                    {
                        break;
                    }

                    for (int directionNumber = 0; directionNumber < verticalFieldDirections.Length; directionNumber++)
                    {
                        int verticalFieldId = verticalFieldDirections[directionNumber];
                        if (verticalFieldId == MapLoader.EmptyField)
                        {
                            continue;
                        }

                        DirectionUtil.Direction direction = (DirectionUtil.Direction)directionNumber;

                        MeshFilter verticalFilter = GameObject.Instantiate <MeshFilter>(tilePool);
                        verticalFilter.transform.parent   = mapRoot.transform.transform;
                        verticalFilter.transform.rotation = MapLoader.SurfaceDirection[direction];
                        verticalFilter.transform.position = new Vector3(col * FieldUnit.x + 0.5f, ((float)floor + 0.5f) * FieldUnit.y, -row * FieldUnit.z - 0.5f) + MapLoader.SurfaceOffset[direction];

                        if (!verticalMeshFilterDictionary.ContainsKey(verticalFieldId))
                        {
                            verticalMeshFilterDictionary.Add(verticalFieldId, new List <MeshFilter> {
                            });
                        }

                        List <MeshFilter> verticalFilters = verticalMeshFilterDictionary[verticalFieldId];
                        verticalFilters.Add(verticalFilter);
                    }
                } while (false);
            }

            FieldCollider fieldCollider = GameObject.Instantiate <FieldCollider>(fieldColliderPrototype);
            float         height        = Mathf.Floor(map.fields[0].Length / width) + 1;
            fieldCollider.Init(width, height, floor);
            fieldCollider.transform.parent = mapRoot.transform;
            // TODO:
            fieldCollider.gameObject.SetActive(floor == 0);
        }

        // combine meshes
        {
            foreach (KeyValuePair <int, List <MeshFilter> > kv in meshFilterDictionary)
            {
                List <MeshFilter> filters = kv.Value;
                CombineInstance[] combine = new CombineInstance[filters.Count];
                for (int i = 0; i < filters.Count; i++)
                {
                    combine[i].mesh         = filters[i].sharedMesh;
                    combine[i].transform    = filters[i].transform.localToWorldMatrix;
                    combine[i].subMeshIndex = 0;
                    GameObject.Destroy(filters[i].gameObject);
                }

                FieldTile tile = GameObject.Instantiate <FieldTile>(fieldPrototype);
                tile.InitCombinedFloor(combine, kv.Key - 1);
                tile.transform.parent = mapRoot.transform;
            }

            foreach (KeyValuePair <int, List <MeshFilter> > kv in verticalMeshFilterDictionary)
            {
                List <MeshFilter> filters = kv.Value;
                CombineInstance[] combine = new CombineInstance[filters.Count];
                for (int i = 0; i < filters.Count; i++)
                {
                    combine[i].mesh         = filters[i].sharedMesh;
                    combine[i].transform    = filters[i].transform.localToWorldMatrix;
                    combine[i].subMeshIndex = 0;
                    GameObject.Destroy(filters[i].gameObject);
                }

                FieldTile tile = GameObject.Instantiate <FieldTile>(verticalPrototype);
                tile.InitCombinedFloor(combine, kv.Key - 1);
                tile.gameObject.AddComponent <Terrain>();
                tile.transform.parent = mapRoot.transform;

                // skip this if scene allows penetrate path finding raycast
                MeshCollider collider = tile.GetComponent <MeshCollider>();
                collider.sharedMesh = tile.GetComponent <MeshFilter>().sharedMesh;

                /*
                 * CombineInstance[] rcombine = new CombineInstance[filters.Count];
                 * for (int i = 0; i < filters.Count; i++)
                 * {
                 *  Vector3 euler = rcombine[i].transform.rotation.eulerAngles;
                 *  rcombine[i].mesh = filters[i].sharedMesh;
                 *  filters[i].transform.rotation = Quaternion.Euler(new Vector3(euler.x, euler.y + 180.0f, euler.z));
                 *  rcombine[i].transform = filters[i].transform.localToWorldMatrix;
                 *  rcombine[i].subMeshIndex = 0;
                 *  GameObject.Destroy(filters[i].gameObject);
                 * }
                 *
                 * FieldTile rtile = GameObject.Instantiate<FieldTile>(verticalPrototype);
                 * rtile.InitCombinedFloor(rcombine, kv.Key - 1);
                 * rtile.gameObject.AddComponent<Terrain>();
                 * rtile.transform.parent = mapRoot.transform;
                 *
                 * // skip this if scene allows penetrate path finding raycast
                 * MeshCollider rcollider = rtile.GetComponent<MeshCollider>();
                 * rcollider.sharedMesh = rtile.GetComponent<MeshFilter>().sharedMesh;
                 */
            }
        }

        return(mapRoot);
    }