// Use this for initialization
 void Start()
 {
     building = GetComponent <SimpleBuildingBehaviour>();
     if (building.enabled)
     {
         StartCoroutine(GenerateResources());
     }
 }
Beispiel #2
0
        // Use this for initialization
        void Start()
        {
            building = GetComponent <SimpleBuildingBehaviour>();

            if (building != null && building.isActiveAndEnabled && building.world.GetTileType(transform.position) == MapTile.MapTileType.LEANING)
            {
                MapTile tile = building.world.GetTileFromWorldPosition(transform.position);


                //Next we rotate the road to "lean with terrain". If it DOES lean then we stretch it in case it goes up a hill so that it reaches all the way
                if (building.world.isTileLeaningDownY(tile))
                {
                    Vector3 scale = transform.localScale;
                    if (transform.rotation.eulerAngles.y % 180 < 1)
                    {
                        scale.z *= 1.5f;
                    }
                    transform.localScale = scale;

                    transform.Rotate(new Vector3(-45, 0, 0), Space.World);
                }
                if (building.world.isTileLeaningUpY(tile))
                {
                    Vector3 scale = transform.localScale;
                    if (transform.rotation.eulerAngles.y % 180 < 1)
                    {
                        scale.z *= 1.5f;
                    }
                    transform.localScale = scale;

                    transform.Rotate(new Vector3(45, 0, 0), Space.World);
                }
                if (building.world.isTileLeaningDownX(tile))
                {
                    Vector3 scale = transform.localScale;
                    if (transform.rotation.eulerAngles.y % 180 > 1)
                    {
                        scale.z *= 1.5f;
                    }
                    transform.localScale = scale;

                    transform.Rotate(new Vector3(0, 0, 45), Space.World);
                }
                if (building.world.isTileLeaningUpX(tile))
                {
                    Vector3 scale = transform.localScale;
                    if (transform.rotation.eulerAngles.y % 180 > 1)
                    {
                        scale.z *= 1.5f;
                    }
                    transform.localScale = scale;

                    transform.Rotate(new Vector3(0, 0, -45), Space.World);
                }
            }
        }
Beispiel #3
0
        public void Bulldoze(int x, int y)
        {
            int key = world.GetTileCoordKey(x, y);

            if (buildingTiles.ContainsKey(key))
            {
                //A building is only stored once in buildings but stored for every tile it occupies in WorldBehaviour.buildings
                SimpleBuildingBehaviour buildingBehaviour = buildingTiles[key];
                RemoveBuilding(buildingBehaviour);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Adds a building to the world. This could be through construction or when loading a game.
        /// If you load a game then there might be finished buildings but they still must be properly registered!
        /// </summary>
        /// <param name="building">Building.</param>
        internal void RegisterBuilding(SimpleBuildingBehaviour building)
        {
            building.transform.SetParent(transform);
            if (building.isSceneBuilding)
            {
                if (!sceneBuildings.Contains(building))
                {
                    sceneBuildings.Add(building);

                    //Set the building to be in a correct tile (you could see this as rounding off the position)
                    MapTile tile = world.GetTileFromWorldPosition(building.transform.position);
                    Vector3 pos  = world.GetWorldPositionFromTile(tile);
                    building.transform.position = pos;

                    //Next we need to make the tiles occupied with this building so that other vuildings can't be built in the same location
                    int width  = building.buildingType.buildArea.width;
                    int length = building.buildingType.buildArea.length;

                    //If we have an even number as width or length then we want the center to be moved by one step
                    pos += new Vector3(width % 2 - 1, 0, length % 2 - 1) * world.worldData.tileWidth / 2f;

                    //Calc tile coords
                    int startX = (int)((pos.x - width * 0.5f) / world.worldData.tileWidth);
                    int startY = (int)((pos.z - length * 0.5f) / world.worldData.tileWidth);
                    int stopX  = startX + width;
                    int stopY  = startY + length;

                    //We add a reference to this building in every tile it occupies
                    for (int i = startX; i <= stopX; i++)
                    {
                        for (int j = startY; j <= stopY; j++)
                        {
                            int key = world.GetTileCoordKey(i, j);
                            buildingTiles.Add(key, building);
                        }
                    }
                }
            }
            else
            {
                buildings.Add(building.buildingInstanceData.key, building);
            }
        }
        public void ShowBuildingInfo(SimpleBuildingBehaviour building)
        {
            currentBuilding = null;
            txtName.text    = building.buildingType.name;
            var productionScript = building.GetComponent <ResourceGeneratorBehaviour>();

            if (productionScript)
            {
                txtProduction.text       = productionScript.resourceGenerated.ToString();
                txtConsumtion.text       = productionScript.resourceConsumed.ToString();
                rdoProductionActive.isOn = productionScript.isActive;
                rdoProductionActive.gameObject.SetActive(true);
            }
            else
            {
                txtProduction.text = "";
                txtConsumtion.text = "";
                rdoProductionActive.gameObject.SetActive(false);
            }
            gameObject.SetActive(true);
            currentBuilding = building;
        }
Beispiel #6
0
        public void RemoveBuilding(SimpleBuildingBehaviour buildingBehaviour)
        {
            int buildingPosKey = buildingBehaviour.positionKey;

            buildings.Remove(buildingPosKey);

            for (int i = 0; i < buildingBehaviour.width; i++)
            {
                for (int j = 0; j < buildingBehaviour.length; j++)
                {
                    int tmpKey = world.GetTileCoordKey(buildingPosKey % world.tileMapSize + i, buildingPosKey / world.tileMapSize + j);
                    buildingTiles.Remove(tmpKey);
                    //Debug.Log("Removing building at x: " + (buildingPosKey % tileMapSize + i) + " y: " + (buildingPosKey / tileMapSize + j));
                }
            }

            GameObject.Destroy(buildingBehaviour.gameObject);

            if (OnBuildingsChanged != null)
            {
                OnBuildingsChanged();
            }
        }
 // Use this for initialization
 void Start()
 {
     building = GetComponentInParent <SimpleBuildingBehaviour>();
     meter    = GetComponent <UIMeterBehaviour>();
 }
Beispiel #8
0
        /// <summary>
        /// Instantiates the building by actually creating the gameobject and assigning it to the world
        /// </summary>
        /// <param name="x">The x coordinate.</param>
        /// <param name="y">The y coordinate.</param>
        /// <param name="buildingInstance">Building instance.</param>
        protected void InstantiateBuilding(int x, int y, SimpleBuildingInstance buildingInstance)
        {
            SimpleBuildingType buildingType = buildingTypes[buildingInstance.buildingTypeIndex];

            int width  = buildingType.buildArea.width;
            int length = buildingType.buildArea.length;

            //If we turned the building -90 or 90 degrees then switch width and length
            if (buildingInstance.direction % 2 == 1)
            {
                width  = buildingType.buildArea.length;
                length = buildingType.buildArea.width;
            }


            int startX = x;
            int stopX  = x + width - 1;
            int startY = y;
            int stopY  = y + length - 1;

            buildingInstance.x = x;
            buildingInstance.y = y;

            //Calculate dead center of building area to place the actual game object
            Vector3 pos = (world.GetWorldPositionFromTile(startX, startY, true) + world.GetWorldPositionFromTile(stopX, stopY, true)) / 2;

            GameObject building = (GameObject)GameObject.Instantiate(buildingType.prefab, pos, Quaternion.identity);

            building.name = buildingType.name;

            Collider buildingCollider = building.GetComponent <Collider>();

            if (buildingCollider != null)
            {
                buildingCollider.enabled = true;
            }
            Vector3 scale = building.transform.localScale;

            scale = Vector3.Scale(buildingType.scale, scale);
            building.transform.localScale = scale;

            Vector3 rot = building.transform.eulerAngles;

            rot.y = 90 * buildingInstance.direction;
            building.transform.rotation = Quaternion.Euler(rot);

            if (buildingType.doLeanWithTerrain)
            {
                if (world.isTileLeaningDownX(x, y))
                {
                    building.transform.Rotate(45, 0, 0);
                }
                if (world.isTileLeaningUpX(x, y))
                {
                    building.transform.Rotate(-45, 0, 0);
                }
                if (world.isTileLeaningDownY(x, y))
                {
                    building.transform.Rotate(-45, 0, 0);
                }
                if (world.isTileLeaningUpY(x, y))
                {
                    building.transform.Rotate(45, 0, 0);
                }
            }

            SimpleBuildingBehaviour buildingBehaviour = building.GetComponent <SimpleBuildingBehaviour>();

            buildingBehaviour.positionKey          = world.GetTileCoordKey(x, y);
            buildingBehaviour.buildingType         = buildingType;
            buildingBehaviour.buildingInstanceData = buildingInstance;
            buildingBehaviour.width  = width;
            buildingBehaviour.length = length;
            buildingBehaviour.Setup();

            //Add construction utilities if applicable
            if (buildingBehaviour.underConstructionBuilding != null &&
                constructionUtilitiesPrefab != null)
            {
                GameObject constructionUtilities = Instantiate <GameObject>(constructionUtilitiesPrefab);
                constructionUtilities.transform.SetParent(buildingBehaviour.underConstructionBuilding.transform);
                constructionUtilities.transform.localPosition = Vector3.zero;
            }

            //We add a reference to this building in every tile it occupies
            for (int i = x; i <= stopX; i++)
            {
                for (int j = y; j <= stopY; j++)
                {
                    int key = world.GetTileCoordKey(i, j);
                    buildingTiles.Add(key, buildingBehaviour);
                }
            }

            if (OnBuildingsChanged != null)
            {
                OnBuildingsChanged();
            }
        }