Example #1
0
    /// <summary>
    /// This function is called to update the furniture. This will also trigger EventsActions.
    /// This checks if the furniture is a PowerConsumer, and if it does not have power it cancels its job.
    /// </summary>
    /// <param name="deltaTime">The time since the last update was called.</param>
    public void FixedFrequencyUpdate(float deltaTime)
    {
        // requirements from components (gas, ...)
        bool canFunction = true;

        BuildableComponent.Requirements newRequirements = BuildableComponent.Requirements.None;
        foreach (BuildableComponent component in components)
        {
            bool componentCanFunction = component.CanFunction();
            canFunction &= componentCanFunction;

            // if it can't function, collect all stuff it needs (power, gas, ...) for icon signalization
            if (!componentCanFunction)
            {
                newRequirements |= component.Needs;
            }
        }

        // requirements were changed, force update of status icons
        if (Requirements != newRequirements)
        {
            Requirements = newRequirements;
            OnIsOperatingChanged(this);
        }

        IsOperating = canFunction;

        if (canFunction == false)
        {
            if (prevUpdatePowerOn)
            {
                EventActions.Trigger("OnPowerOff", this, deltaTime);
            }

            Jobs.PauseAll();
            prevUpdatePowerOn = false;
            return;
        }

        prevUpdatePowerOn = true;
        Jobs.ResumeAll();

        if (EventActions != null)
        {
            EventActions.Trigger("OnUpdate", this, deltaTime);
        }

        foreach (BuildableComponent component in components)
        {
            component.FixedFrequencyUpdate(deltaTime);
        }

        if (Animation != null)
        {
            Animation.Update(deltaTime);
        }
    }
        public void AddStatus(BuildableComponent.Requirements requirements, GameObject gameObj)
        {
            if (StatusIndicators == null)
            {
                StatusIndicators = new Dictionary <BuildableComponent.Requirements, GameObject>();
            }

            StatusIndicators[requirements] = gameObj;
        }
Example #3
0
    public BuildableComponent.Requirements GetPossibleRequirements()
    {
        BuildableComponent.Requirements requires = BuildableComponent.Requirements.None;

        foreach (BuildableComponent component in components)
        {
            requires |= component.Needs;
        }

        return(requires);
    }
 private Sprite GetStatusIndicatorSprite(BuildableComponent.Requirements oneIdicator)
 {
     return(SpriteManager.GetSprite("Icon", string.Format("{0}Indicator", oneIdicator.ToString())));
 }
    protected override void OnCreated(Furniture furniture)
    {
        GameObject furn_go = new GameObject();

        // Add our tile/GO pair to the dictionary.
        objectGameObjectMap.Add(furniture, furn_go);

        // FIXME: This hardcoding is not ideal!
        if (furniture.HasTypeTag("Door"))
        {
            // Check to see if we actually have a wall north/south, and if so
            // set the furniture verticalDoor flag to true.
            Tile northTile = world.GetTileAt(furniture.Tile.X, furniture.Tile.Y + 1, furniture.Tile.Z);
            Tile southTile = world.GetTileAt(furniture.Tile.X, furniture.Tile.Y - 1, furniture.Tile.Z);

            if (northTile != null && southTile != null && northTile.Furniture != null && southTile.Furniture != null &&
                northTile.Furniture.HasTypeTag("Wall") && southTile.Furniture.HasTypeTag("Wall"))
            {
                furniture.VerticalDoor = true;
            }
        }

        SpriteRenderer sr = furn_go.AddComponent <SpriteRenderer>();

        sr.sprite           = GetSpriteForFurniture(furniture);
        sr.sortingLayerName = "Furniture";
        sr.color            = furniture.Tint;

        furn_go.name = furniture.Type + "_" + furniture.Tile.X + "_" + furniture.Tile.Y;
        furn_go.transform.position = furniture.Tile.Vector3 + ImageUtils.SpritePivotOffset(sr.sprite, furniture.Rotation);
        furn_go.transform.Rotate(0, 0, furniture.Rotation);
        furn_go.transform.SetParent(objectParent.transform, true);

        sr.sortingOrder = Mathf.RoundToInt(furn_go.transform.position.y * -1);

        FurnitureChildObjects childObjects = new FurnitureChildObjects();

        childObjectMap.Add(furniture, childObjects);

        childObjects.Overlay = new GameObject();
        childObjects.Overlay.transform.parent   = furn_go.transform;
        childObjects.Overlay.transform.position = furn_go.transform.position;
        SpriteRenderer spriteRendererOverlay = childObjects.Overlay.AddComponent <SpriteRenderer>();
        Sprite         overlaySprite         = GetOverlaySpriteForFurniture(furniture);

        if (overlaySprite != null)
        {
            spriteRendererOverlay.sprite           = overlaySprite;
            spriteRendererOverlay.sortingLayerName = "Furniture";
            spriteRendererOverlay.sortingOrder     = Mathf.RoundToInt(furn_go.transform.position.y * -1) + 1;
        }

        // indicators (power, fluid, ...)
        BuildableComponent.Requirements furnReq = furniture.GetPossibleRequirements();
        foreach (BuildableComponent.Requirements req in Enum.GetValues(typeof(BuildableComponent.Requirements)))
        {
            if (req != BuildableComponent.Requirements.None && (furnReq & req) == req)
            {
                GameObject indicator = new GameObject();
                indicator.transform.parent     = furn_go.transform;
                indicator.transform.localScale = new Vector3(IndicatorScale, IndicatorScale, IndicatorScale);
                indicator.transform.position   = furn_go.transform.position + statusIndicatorOffsets[req];

                SpriteRenderer powerSpriteRenderer = indicator.AddComponent <SpriteRenderer>();
                powerSpriteRenderer.sprite           = GetStatusIndicatorSprite(req);
                powerSpriteRenderer.sortingLayerName = "Power";
                powerSpriteRenderer.color            = Color.red;

                childObjects.AddStatus(req, indicator);
            }
        }

        UpdateIconObjectsVisibility(furniture, childObjects);

        if (furniture.Animations != null)
        {
            furniture.Animations.Renderer = sr;
        }

        // Register our callback so that our GameObject gets updated whenever
        // the object's into changes.
        furniture.Changed            += OnChanged;
        furniture.Removed            += OnRemoved;
        furniture.IsOperatingChanged += OnIsOperatingChanged;
    }