Skip to content

Commit

Permalink
Power system should react on changes to powerValue (#506)
Browse files Browse the repository at this point in the history
* Fixed #502 Power system should react on changes to poawerValue

* Added end of file line

* Fixed #502 Power system should react on changes to poawerValue

* Added end of file line

* Style
  • Loading branch information
Grenkin1988 authored and vogonistic committed Aug 22, 2016
1 parent 74b2907 commit 67479b1
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 50 deletions.
36 changes: 20 additions & 16 deletions Assets/Scripts/Controllers/FurnitureSpriteController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void OnFurnitureCreated(Furniture furn)
sr.sortingLayerName = "Furniture";
sr.color = furn.tint;

if (furn.powerValue < 0)
if (furn.PowerValue < 0)
{
GameObject power_go = new GameObject();
powerStatusGameObjectMap.Add(furn, power_go);
Expand All @@ -93,10 +93,12 @@ public void OnFurnitureCreated(Furniture furn)
powerSR.sortingLayerName = "Power";
powerSR.color = PowerStatusColor();

if (world.powerSystem.PowerLevel > 0) {
if (world.powerSystem.PowerLevel > 0)
{
power_go.SetActive(false);
}
else {
else
{
power_go.SetActive(true);
}

Expand Down Expand Up @@ -166,12 +168,14 @@ void OnFurnitureChanged(Furniture furn)
}

furn_go.GetComponent<SpriteRenderer>().sprite = GetSpriteForFurniture(furn);
furn_go.GetComponent<SpriteRenderer>().color = furn.tint;
furn_go.GetComponent<SpriteRenderer>().color = furn.tint;

}

void OnPowerStatusChange(Furniture furn)
void OnPowerStatusChange(IPowerRelated powerRelated)
{
Furniture furn = powerRelated as Furniture;
if (furn == null) return;
if (powerStatusGameObjectMap.ContainsKey(furn) == false)
return;

Expand All @@ -181,12 +185,12 @@ void OnPowerStatusChange(Furniture furn)
{
power_go.SetActive(false);
}
else
else
{
power_go.SetActive(true);
}
power_go.GetComponent<SpriteRenderer>().color = PowerStatusColor();

power_go.GetComponent<SpriteRenderer>().color = PowerStatusColor();
}


Expand Down Expand Up @@ -293,22 +297,22 @@ public Sprite GetSpriteForFurniture(Furniture furn)
// the same type, then the string will look like:
// Wall_NESW

/* if(furnitureSprites.ContainsKey(spriteName) == false) {
Logger.LogError("GetSpriteForInstalledObject -- No sprites with name: " + spriteName);
return null;
}
*/
/* if(furnitureSprites.ContainsKey(spriteName) == false) {
Logger.LogError("GetSpriteForInstalledObject -- No sprites with name: " + spriteName);
return null;
}
*/

return SpriteManager.current.GetSprite("Furniture", spriteName); //furnitureSprites[spriteName];

}

Sprite GetPowerStatusSprite()
Sprite GetPowerStatusSprite()
{
return SpriteManager.current.GetSprite("Power", "PowerIcon");
}

Color PowerStatusColor()
Color PowerStatusColor()
{
if (world.powerSystem.PowerLevel > 0)
return Color.green;
Expand All @@ -319,7 +323,7 @@ Color PowerStatusColor()
public Sprite GetSpriteForFurniture(string objectType)
{
Sprite s = SpriteManager.current.GetSprite("Furniture", objectType + (World.current.furniturePrototypes[objectType].linksToNeighbour ? "_" : ""));

return s;
}
}
50 changes: 39 additions & 11 deletions Assets/Scripts/Models/Furniture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,17 @@
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using MoonSharp;
using MoonSharp.Interpreter;
using MoonSharp.Interpreter.Interop;
using UnityEngine;

// InstalledObjects are things like walls, doors, and furniture (e.g. a sofa)
/// <summary>
/// InstalledObjects are things like walls, doors, and furniture (e.g. a sofa).
/// </summary>
[MoonSharpUserData]
public class Furniture : IXmlSerializable, ISelectable
public class Furniture : IXmlSerializable, ISelectable, IPowerRelated
{
private float powerValue;
/// <summary>
/// Custom parameter for this particular piece of furniture. We are
/// using a dictionary because later, custom LUA function will be
Expand Down Expand Up @@ -52,6 +54,31 @@ public class Furniture : IXmlSerializable, ISelectable
// If the job causes some kind of object to be spawned, where will it appear?
public Vector2 jobSpawnSpotOffset = Vector2.zero;

public event Action<IPowerRelated> PowerValueChanged;

public float PowerValue
{
get
{
return powerValue;
}

set
{
if (powerValue == value) return;
powerValue = value;
InvokePowerValueChanged(this);
}
}

public bool IsPowerConsumer
{
get
{
return PowerValue < 0.0f;
}
}

public void Update(float deltaTime)
{
if (updateActions != null)
Expand All @@ -74,13 +101,14 @@ public ENTERABILITY IsEnterable()

return (ENTERABILITY)ret.Number;
}

// If this furniture generates power then powerValue will be positive, if it consumer power then it will be negative
public float powerValue;

public bool IsPowerConsumer
{
get { return powerValue < 0; }

private void InvokePowerValueChanged(IPowerRelated powerRelated)
{
Action<IPowerRelated> handler = PowerValueChanged;
if (handler != null)
{
handler(powerRelated);
}
}

// This represents the BASE tile of the object -- but in practice, large objects may actually occupy
Expand Down Expand Up @@ -214,7 +242,7 @@ protected Furniture(Furniture other)

this.powerValue = other.powerValue;

if (!powerValue.Equals(0))
if (!PowerValue.Equals(0))
{
World.current.powerSystem.AddToPowerGrid(this);
}
Expand Down
30 changes: 30 additions & 0 deletions Assets/Scripts/Models/IPowerRelated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#region License
// ====================================================
// Project Porcupine Copyright(C) 2016 Team Porcupine
// This program comes with ABSOLUTELY NO WARRANTY; This is free software,
// and you are welcome to redistribute it under certain conditions; See
// file LICENSE, which is part of this source code package, for details.
// ====================================================
#endregion

using System;

public interface IPowerRelated
{
event Action<IPowerRelated> PowerValueChanged;

/// <summary>
/// Amount of power object produce or consume. Positive for produce, negative for consume.
/// </summary>
float PowerValue { get; }

/// <summary>
/// Determines whether object produce or consume power.
/// </summary>
bool IsPowerConsumer { get; }

/// <summary>
/// Determines whether object is plugged to power grid and has power.
/// </summary>
bool HasPower();
}
12 changes: 12 additions & 0 deletions Assets/Scripts/Models/IPowerRelated.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

58 changes: 35 additions & 23 deletions Assets/Scripts/Models/PowerSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@

public class PowerSystem
{
private HashSet<Furniture> powerGrid;
private HashSet<IPowerRelated> powerGrid;

private float currentPower;

public PowerSystem()
{
powerGrid = new HashSet<Furniture>();
powerGrid = new HashSet<IPowerRelated>();
}

public event Action<Furniture> PowerLevelChanged;
public event Action<IPowerRelated> PowerLevelChanged;

public float PowerLevel
{
Expand All @@ -40,39 +40,45 @@ private set
}
}

public bool AddToPowerGrid(Furniture furniture)
public bool AddToPowerGrid(IPowerRelated powerRelated)
{
if (PowerLevel + furniture.powerValue < 0)
if (PowerLevel + powerRelated.PowerValue < 0)
{
return false;
}

powerGrid.Add(furniture);
AdjustPowelLevel(furniture);
furniture.cbOnRemoved += RemoveFromPowerGrid;
powerGrid.Add(powerRelated);
AdjustPowelLevel(powerRelated);
powerRelated.PowerValueChanged += OnPowerValueChanged;
Furniture furniture = powerRelated as Furniture;
if (furniture != null)
{
furniture.cbOnRemoved += RemoveFromPowerGrid;
}

return true;
}

public void RemoveFromPowerGrid(Furniture furniture)
public void RemoveFromPowerGrid(IPowerRelated powerRelated)
{
powerGrid.Remove(furniture);
AdjustPowelLevel(furniture, false);
powerGrid.Remove(powerRelated);
AdjustPowelLevel(powerRelated, false);
}

public bool RequestPower(Furniture furniture)
public bool RequestPower(IPowerRelated powerRelated)
{
return powerGrid.Contains(furniture);
return powerGrid.Contains(powerRelated);
}

private void AdjustPowelLevel(Furniture furniture, bool isFurnitureAdded = true)
private void AdjustPowelLevel(IPowerRelated powerRelated, bool isFurnitureAdded = true)
{
if (isFurnitureAdded)
{
PowerLevel += furniture.powerValue;
PowerLevel += powerRelated.PowerValue;
}
else
{
PowerLevel -= furniture.powerValue;
PowerLevel -= powerRelated.PowerValue;
}

if (PowerLevel < 0)
Expand All @@ -83,8 +89,8 @@ private void AdjustPowelLevel(Furniture furniture, bool isFurnitureAdded = true)

private void RemovePowerConsumer()
{
Furniture powerConsumer = powerGrid.FirstOrDefault(furniture => furniture.IsPowerConsumer);
if (powerConsumer == null)
IPowerRelated powerConsumer = powerGrid.FirstOrDefault(powerRelated => powerRelated.IsPowerConsumer);
if (powerConsumer == null)
{
return;
}
Expand All @@ -94,18 +100,24 @@ private void RemovePowerConsumer()

private void NotifyPowerConsumers()
{
foreach (Furniture furniture in powerGrid.Where(furniture => furniture.IsPowerConsumer))
foreach (IPowerRelated powerRelated in powerGrid.Where(powerRelated => powerRelated.IsPowerConsumer))
{
InvokePowerLevelChanged(furniture);
InvokePowerLevelChanged(powerRelated);
}
}

private void InvokePowerLevelChanged(Furniture furniture)
private void OnPowerValueChanged(IPowerRelated powerRelated)
{
RemoveFromPowerGrid(powerRelated);
AddToPowerGrid(powerRelated);
}

private void InvokePowerLevelChanged(IPowerRelated powerRelated)
{
Action<Furniture> handler = PowerLevelChanged;
Action<IPowerRelated> handler = PowerLevelChanged;
if (handler != null)
{
handler(furniture);
handler(powerRelated);
}
}
}

0 comments on commit 67479b1

Please sign in to comment.