#Idlekit Gameplay Changelog

## Version 1.4.0, 2020-xx-xx
### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
### Base Collector Entity
* *FEATURE* Introduced `IPayoutEntity`, which is implemented by `IEntity` that can be paid out by any implementation of `IBaseCollectorEntity`. At the moment, only `ICurrency` and `IReward` implement the interface.
* *CHANGE* `IBaseCollectorBalanceData's` `double basePayout`and `string payoutCurrencyId` getters have been renamed to `basePayoutAmount` and `payoutEntityId`. See `UPGRADENOTES.md` for details.
* *CHANGE* `IBaseCollectorEntity's` `double payout` getter and `void GetPayout(bool, IModifier[])` method have been renamed. See `UPGRADENOTES.md` for details.

### Currency
* *CHANGE* `ICurrency` and `ICurrencyData` implement `IPayoutEntity` and `IPayoutEntityData` so it can be output by an `IBaseCollectorEntity`.

### Reward
* *CHANGE* `IReward` and `IRewardData` implement `IPayoutEntity` and `IPayoutEntityData` so it can be output by an `IBaseCollectorEntity`.

### Time Service
* *FEATURE* Introduced `Pause` and `Resume` to the `ITimerService` to prevent `gametime` from automatically updated.

### idlekit-implementation
### Activity Tracking Service
* *CHANGE* The service now pauses the `ITimerService` to prevent automatic timed updates between the `SetContentStateAction` and `IdleKitInitializedAction` during the initialization of a `IContent`. This makes sure that the catchup logic can be performed after `IdleKitInitializedAction` after an `IContent` initialization.

### Goal
* *CHANGE* `DynamicGoal.targetProgress` estimation has been changed to only target `IGeneratorEntities` that are producing `ICurrencies` since an `IGeneratorEntity` can also produce `IReward` due to the introduction of `IPayoutEntity`.
* *FEATURE* Added `CollectFromCollectorTypeGoal`, which progresses when the player collects from any or a specified `ICollectorEntity`.
* *CHANGE* Added `CollectFromGeneratorTypeGoalData.any`, so when `any` is set to true the goal targets any `IGeneratorEntity`s in the Stage.
* *CHANGE* `GeneratorGoal` has been renamed to `BaseCollectorGoal`.

### Projection Service
* *CHANGE* `GetPayoutProjections()` calculation has been changed to only target `IGeneratorEntities` that are producing `ICurrencies` since an `IGeneratorEntity` can also produce `IReward` due to the introduction of `IPayoutEntity`.

### State Action
* *CHANGE* Due to `ICurrency` and `IReward` changed to implement the common `IPayoutEntity` interface, `GrantRewardStateAction` and `CollectFromBaseCollectorStateAction` also changed to share the same base code `GrantPayoutStateAction`.

### idlekit-tools
### UI
* *CHANGE* `Collector` and `Generator` UI info buttons now also display the `IPayoutEntity` id, type, and amount.

### PlotPoint Editor
* *CHANGE* `PlotPointEditor.SaveSequence` has been simplified and refactored into a number of methods to improve readability and extensibility.

### idlekit-examples
### Generator Example
* *CHANGE* The Generator example has been retrofitted to work with a regular `IGeneratorEntity` to produce an `IReward`. All the custom scripts have been removed as the base `IBaseCollectorEntity` now supports outputting an `IReward`.

### idlekit-showcase
* N/A

## Version 1.3.0, 2020-08-31
### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
### Base Collector Entity
* *FEATURE* Added a new `IBaseCollectorEntity` that contains the properties shared between `IGeneratorEntity` and `ICollectorEntity`. The following interfaces have been similarly added:
  * `IBaseCollectorBalanceData`
  * `IBaseCollectorData`
  * `IBaseCollectorEntityData`
  * `IBaseCollectorEntitySavedData`

### Collector Entity
* *FEATURE* Added a new `ICollectorEntity` which extends `IBaseCollectorEntity`. Similarly to `IGeneratorEntity`, the following interfaces have also been added:
  * `ICollectorBalanceData`
  * `ICollectorData`
  * `ICollectorEntityData`
  * `ICollectorEntitySavedData`
* *FEATURE* The following Actions have been added:
  * `CollectorInitializedAction`
  * `CollectorPayoutChangedAction`
  * `CollectorStateChangedAction`
  * `CollectorSpeedChangedAction`
* *FEATURE* The following StateActions have been added:
  * `BuyCollectorStateAction`
  * `CollectFromCollectorStateAction`

### Economy Service
* *CHANGE* `IEconomyService.GetPayout(IBaseCollectorEntity baseCollectorEntity)` has been deprecated, use `IBaseCollectorEntity.GetPayout()` instead.
* *CHANGE* `IEconomyService.GetPayout(IBaseCollectorEntity baseCollectorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IBaseCollectorEntity.GetPayout(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* *CHANGE* `IEconomyService.GetDuration(IBaseCollectorEntity baseCollectorEntity)` has been deprecated, use `IBaseCollectorEntity.GetDuration()` instead.
* *CHANGE* `IEconomyService.GetDuration(IBaseCollectorEntity baseCollectorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IBaseCollectorEntity.GetDuration(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* *CHANGE* `IEconomyService.GetAffordableUnitsToNextTarget(IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IGeneratorEntity.GetAffordableUnitsToNextTarget(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* *CHANGE* `IEconomyService.GetMaxAffordableUnits(IGeneratorEntity generatorEntity, bool applyModifiers, int maxCap = -1, IModifier[] excludedModifiers = null)`has been deprecated, use `IGeneratorEntity.GetMaxAffordableUnits(bool applyModifiers, int maxCap = -1, IModifier[] excludedModifiers = null)` instead.
* *CHANGE* `IEconomyService.GetIncrementGeneratorUnitCost(int unitsToIncrease, IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IGeneratorEntity.GetIncrementGeneratorUnitCost(int unitsToIncrease, bool applyModifiers, IModifier[] excludedModifiers = null)` instead.

### Event Content
* *REMOVE* `IEventContentSavedData` and `IStandardEventContentSavedData` have been removed as we no longer track the index of the active `IMilestone`. See `UPGRADENOTES.md` for details.
* *CHANGE* `IEventContent.activeMilestone` has been renamed to `IEventContent.GetCurrentMilestone()`.
* *FEATURE* Added `IEventContent.GetCurrentMilestoneIndex()` to return the index of the current `IMilestone`. This is useful for UI display purpose.

### Event Settings
* *FEATURE* Added `bool MilestoneCompletionInfo.complete` that indicates the `IMilestone` associated with the `MilestoneCompletionInfo` has been actually completed instead of having a projected completion time (see below).
* *CHANGE* `MilestoneCompletionInfo.completionTime` has been renamed to `MilestoneCompletionInfo.projectedCompletionTime`. This is a saved data breaking change and a `FormerlySerializedAs` attribute is added to the `MilestoneCompletionInfo.projectedCompletionTime`. See `UPGRADENOTES.md` for details.
* *CHANGE* `IEventSettings.CanCompleteMilestone(string);` has been changed to `IEventSettings.CanCompleteMilestone(IMilestone);`. See `UPGRADENOTES.md` for details.
* *CHANGE* `IEventSettings.SetMilestoneCompletionTime(string, long);` has been changed to `IEventSettings.SetMilestoneCompletionTime(IMilestone, long);`. See `UPGRADENOTES.md` for details.

### Generator
* *CHANGE* `IGeneratorStates` now implements `IInjectable` that allows them to be injected from the `IContainer`. See the `GeneratorEntity` in `idlekit-implementation` to see how it is utilized.
* *FEATURE* Introduced specific `IGeneratorState` interfaces so the existing `IGeneratorState` interfaces can be injected: 
    * `IAutoCollectState`, `IProduceState`, `IWaitToBuyState`, and `IWaitToCollectState`.
* *CHANGE* `GeneratorStateType` enum has been changed to a static class that contains constant `strings` as state types, see `UPGRADENOTES.md` for more details. The affected `IGeneratorState` and `IGeneratorEntity` interfaces have been updated.
* *CHANGE* In order to support the `ICollectorEntity` feature, the following interfaces have changed:
  * `IGeneratorBalanceData` now extends `IBaseCollectorBalanceData` and has some of its fields moved into it
  * `IGeneratorData` now extends `IBaseCollectorData` and has some of its fields moved into it
  * `IGeneratorEntity` now extends `IBaseCollectorEntity` and has some of its fields and methods moved into it
  * `IGeneratorEntityData` now extends `IBaseCollectorEntityData` and has some of its fields moved into it
  * `IGeneratorEntitySavedData` now extends `IBaseCollectorEntitySavedData` and has some of its fields and methods moved into it
* *CHANGE* `IGeneratorEntity.Collect(long count=1)` now returns `bool` instead of `void` to indicate whether or not the collection was successful

### Standard Content
* *FEATURE* Added a `IStandardContent.collectorEntities` and `IStandardContentData.collectorEntityIds` to support the addition of `CollectorEntity`

### Listener Priority
* *FEATURE* Abstracted the class `ListenerPriority` with constant int values `priorities` from `IActionService` to also provide listener priority to `ITimerListener` in addition to `IAction`.
    * The constant priorities included are: `LOWEST`, `LOW`, `MEDIUM`, `HIGH`, and `HIGHEST`.

### Timed Reward
* *FEATURE* Added `float ITimedReward.progress {get;}` that shows a 0 to 1 progression whether the `ITimedReward` can be claimed or not.

### Timer Service
* *FEATURE* Added the ability to specify the order `ITimerListeners` are evaluated in `ITimerService`. All `ITimerListener` now can optionally provide the `int priority` in its `ITimerSubscription`. The higher the `priority` the earlier the `ITimerListener` would get evaluated.

### idlekit-implementation
### Action
* *REMOVE* `CompleteMilestoneStateAction` has been deprecated, see `UPGRADENOTES.md` for details.
* *CHANGE* `SetProjectedMilestoneCompletionStateAction` has been renamed to `SetMilestoneCompletionInfoStateAction`, see `UPGRADENOTES.md` for details.
* *FEATURE* A `ClearContentAction` has been added. This signifies the point at which the currently loaded `IContent` entity is unloaded when restarting the app or switching content.
* *CHANGE* The `ClearContentStateAction` has been renamed `ClearContentIdStateAction` to more specifically express the behavior of the action. See `UPGRADENOTES.md` for details.

### Collector Entity
* *FEATURE* Added a new `CollectorEntity` which extends `BaseCollectorEntity`.  Similarly to `GeneratorEntity`, the following classes have also been added:
  * `CollectorBalanceData`
  * `CollectorData`
  * `CollectorEntityData`
  * `CollectorEntitySavedData`

### Economy Service
* *CHANGE* `EconomyService.GetPayout(IBaseCollectorEntity baseCollectorEntity)` has been deprecated, use `BaseCollectorEntity.GetPayout()` instead.
* *CHANGE* `EconomyService.GetPayout(IBaseCollectorEntity baseCollectorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `BaseCollectorEntity.GetPayout(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* *CHANGE* `EconomyService.GetDuration(IBaseCollectorEntity baseCollectorEntity)` has been deprecated, use `BaseCollectorEntity.GetDuration()` instead.
* *CHANGE* `EconomyService.GetDuration(IBaseCollectorEntity baseCollectorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `BaseCollectorEntity.GetDuration(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.

### Event Content
* *FEATURE* Added a `string[] collectorEntityIds` property to support the addition of `CollectorEntity`
* *CHANGE* Due to the removal of `IEventContentSavedData`, the `EventContent` implementation now determines the `IEventContent.GetCurrentMilestone()` dynamically based on the `IMilestone.canClaim` status of all the loaded `IMilestones`. 
    * This eliminates the potential risk that the removed `IEventContentSaveData.milestoneIndex` be out of sync with the completion status of the `IMilestones` (it may point to a `IMilestone` that is completed if the they are tracked separately).
    * Use `IMilestone.isActive` on the `IEventContent.GetCurrentMilestone()` to see if the current `IMilestone` is active or not.
    
### Event Settings
* *CHANGE* `IEventSettingsSavedData.SetMilestoneCompletionTime(string, long, bool)` has been updated to only update the `MilestoneCompletionInfo` for the `IMilestone` when `MilestoneCompletionInfo.complete` is `false`.

### Generator
* *CHANGE* The existing `AutoCollectState`, `ProduceState`, `WaitToBuyState`, and `WaitToCollectState` have been retrofitted to work with the new interface and the container.
* *CHANGE* Due to the change of `GeneratorStateType` enum to a static class, affected functions that originally use the enum are now using the type of the `IGeneratorState` object instead.
* *CHANGE* The `IGeneratorStates` are now injected in the `GeneratorEntity` implementation.
* *CHANGE* `AutotCollectState.minimumUpdateInterval { set; }` has been moved to `TestAutoCollectState` in idlekit-tools the `{ get; }` functionality is retained.
* *CHANGE* In order to support the `CollectorEntity` feature, the following classes have changed:
  * `GeneratorBalanceData` now extends `BaseCollectorBalanceData` and has some of its fields moved into it
  * `GeneratorData` now extends `BaseCollectorData` and has some of its fields moved into it
  * `GeneratorEntity` now extends `BaseCollectorEntity` and has some of its fields and methods moved into it
  * `GeneratorEntityData` now extends `BaseCollectorEntityData` and has some of its fields moved into it
  * `GeneratorEntitySavedData` now extends `BaseCollectorEntitySavedData` and has some of its fields and methods moved into it
* *CHANGE* `CollectorEntity.Collect(long count=1)` now returns `bool` instead of `void` to indicate whether or not the collection was successful
* *CHANGE* Removed the `GeneratorAction`. The Actions that previously extended `GeneratorAction` have not been removed.
* *CHANGE* `GeneratorBalanceData` will now log an error if `baseGeneratorUnitCost` is equal to 0.
* *CHANGE* `GeneratorEntitySavedData.Buy()` no longer increments the generator unit by 1. The functionality has been moved into the `BuyGeneratorStateAction` instead.

### Modifier Formula
* *FEATURE* Added `CollectorPayoutModifierFormula` to support Modifiers for `CollectorEntity`
* *FEATURE* Added `CollectorSpeedModifierFormula` to support Modifiers for `CollectorEntity`

### Standard Content
* *FEATURE* Added a `StandardContent.collectorEntities` and `StandardContentData.collectorEntityIds` to support the addition of `CollectorEntity`

### Startup
* *CHANGE* `Startup.ResetGame` will no longer reset the content Id stored within the `IUserSavedData`. The effect of this is that when restarting the app via `ResetGame`, it will boot back into the `IContent` the player had loaded previously. This mirrors the behavior of quitting/restarting the app. See `UPGRADENOTES.md` for details.

### Upgradeable Currency
me* *BUGFIX* Fixed an issue where `upgradeLevel` wasn't reset when resetting `UpgradeableCurrencySavedData`.

### idlekit-tools
### AssemblyUtil
* *CHANGE* `AssemblyUtil` now filters out all system / Unity assemblies and returns IdleKit or custom types.

### Data Asset Importer
* *FEATURE* Importing a single data sheet now updates the entities database if it can be found in the output folder.

### Class Generation Tool
* *CHANGE* The generation of extended `IEventContent` and `IGeneratorEntity` classes has been disabled.

### Guid Reference
* *CHANGE* The Guid Ref helper now supports display of nested assets that share a single path.

### UI
* *BUGFIX* Fix an issue that the `MilestonePanel` scroll kept getting reset when there is an UI update in the game such as when an ICurrency is collected.

### idlekit-examples
### Reward Generator Entity
* *CHANGE* Updated the `RewardGeneratorEntity` and `RewardGeneratorEntityData` to support the addition of `BaseCollectorEntity`.

### Boost
* *CHANGE* Updated the `Boost` example to show how Additive and Multiplicative modifiers can be applied for `IGenerator` speed, payout and unit cost.

### idlekit-showcase
* N/A

### Listener Priority
* *CHANGE* `ActivityTrackingService` now subscribe to `ITimerService` with priority of `LOWEST`.
* *CHANGE* `TimedBoost` now subscribe to `ITimerService` with priority of `LOW`.
* *CHANGE* `SerializationService` no subscribe to `ITimerService` with priority of `LOWEST`.

## Version 1.2.0, 2020-07-02
### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
### Activatable
* *FEATURE* Added `IActivatable` and `IActivatableData`, which are entities that can be activated, deactivated and reset, such as `ITrack` or `IGoal`.

### Event Settings
* *FEATURE* Added `IEventSettings.timeRemaining` to get the time remaining of an event in milliseconds.
* *FEATURE* Added `IEventSettings.SetEventEndTime(long timestamp)` to set the end time (and duration effectively) of an event.
* *CHANGE* `IEventSettingsData.eventDuration` has been deprecated. See UPGRADENOTES.md for details.
* *FEATURE* Added `IEventSettingsSavedData.SetEventEndTime(long timestamp)` to set the `IEventSettingsSavedData.timeCompletedTimestamp`.
* *CHANGE* `IEventSettingsSavedData.EndEvent(long eventEndTimestamp)` has been deprecated. Use `IEventSettingsSavedData.EndEvent()` instead.

### Goal
* *CHANGE* `IGoal` now extends `IActivatable` and `IGoalData` extends `IActivatableData`

### Milestone
* *CHANGE* `IMilestone` now extends `IActivatable` and `IMilestoneData` extends `IActivatableData`

### Projection Service
* *FEATURE* Added `IProjectionService.RefreshPayoutProjections()` to re-calculate the current `IPayoutProjection`s.

### Random Service
* *FEATURE* Added `IRandomService` that handles all random number generation.
* *CHANGE* `IRandomWeightedExtensions.GetRandomWeightedElement()` has been deprecated. Please use `IRandomService.GetRandomWeightedElement` instead.

### Standard Content
* *FEATURE* Added the `IStandardContentFeatures` interface component which extracts the trade, timedboost, and timertrunk logic from the `IStandardContent`.

### Timed Activatable
* *FEATURE* Introduced interfaces for the Timed Activatable: `ITimedActivatable`, `ITimedActivatableData`, `ITimedActivatableDataAsset` and `ITimedActivatableSavedData`. A Timed Activatable contains an `IActivatable` and provides timer functionality to activate and deactivate this activatable.
* *FEATURE* Introduced interfaces for the Timed Track: `ITimedTrack`, `ITimedTrackData`, `ITimedTrackSavedData`.

### Track
* *FEATURE* Introduced interfaces for the Track Entity:
    * `ITrack`, `ITrackData`, `ITrackSavedData`, `ITrackDataAsset`
    * `IGoalTrack`, `IGoalTrackData`
    * `IMilestoneTrack`, `IMilestoneTrackData`, `IMilestoneTrackSavedData`
* *FEATURE* Added `ITrackService` that handles loading of `ITrack`s and `TimedTrack`s.

### idlekit-implementation
### Action
* *FEATURE* Added the `ResetEntitySavedDataStateAction` to reset an `IEntity`'s saved data.
* *FEATURE* Added the `TrackCompletedAction` as part of the Track feature.
* *FEATURE* Added the `TimedEntityCompletedAction` as part of the TimedEntity feature.
* *FEATURE* Added the following state actions as part of the Track feature: `ClaimTrackGoalStateAction`, `ClaimMilestoneTrackRewardsStateAction`, `CompleteMilestoneTrackStateAction`, `CompleteTrackMilestoneStateAction`
* *FEATURE* Added the following state actions for activating and deactivating certain Activatables: `ToggleTimedEntityStateAction`, `ToggleMilestoneStateAction`, `ToggleTrackStateAction`
* *CHANGE* `StaticDataAddedAction` and `StaticDataRemovedAction` now store a dictionary of types and data Ids instead of an array of data, so listeners can iterate through the types instead of type checking each individual data.
* *CHANGE* `EventStartedStateAction` and `EventEndedStateAction` now extend `EventStateAction`.
* *CHANGE* `eventContentId` and `uniqueEventContentId` has been removed from `EventStartedStateAction` and `EventEndedStateAction`. This can be taken from `eventSettings.eventSettingsData` instead.
* *FEATURE* `SetEventDurationStateAction` has been added to change an event's duration.
* *CHANGE* All calls using `System.Random` in reward related actions have been replaced to calls to the `RandomService`.
* *CHANGE* `NewStageStateAction` no longer sets available currencies for the new stage. This functionality has been moved to `Content.SetAvailableCurrencies()`, which dispatches `SetAvailableCurrenciesStateAction`.
* *FEATURE* `SetAvailableCurrenciesStateAction` has been added to set a list of currencies' available status.

### Currency
* *FEATURE* `CurrencyService` now supports loading and unloading of Global currencies and Content specific currencies. Currency entities are also loaded by the service when `ICurrencyData` are loaded.
* *CHANGE* `CurrencyService` now subscribes to `StaticDataAddedAction` and `StaticDataRemovedAction` instead of `ContentDataAddedAction` and `ContentDataRemovedAction`. This ensures that global currencies are not unloaded when switching content.

### Economy Service
* *CHANGE* Add a `double` overflow check for `IEconomyService.GetIncrementGeneratorUnitCost(int, IGeneratorEntity, bool, IModifier[])` in case the generator unit cost becomes too large and returns infinity.

### Event Settings
* *FEATURE* Added `EventSettings.timeRemaining` to get the time remaining of an event in milliseconds.
* *FEATURE* Added `EventSettings.SetEventDuration(long eventDuration)` to set the duration of an event.
* *CHANGE* `EventSettingsData.eventDuration` has been deprecated. See UPGRADENOTES.md for details.
* *FEATURE* Added `EventSettingsSavedData.eventDuration` and `EventSettingsSavedData.SetEventDuration(long eventDuration)` to save the duration of an event.

### Content
* *FEATURE* `BeginStage()` now calls `SetAvailableCurrencies()` to make all currencies in `StageData.availableCurrencyIds` of the current and previous stages to `available`.

### Goal
* *FEATURE* Added `IActivatable` interface member `activatableData` and `isActive` flag to abstract `Goal` class
* *CHANGE* `GoalSavedData.canClaim` now checks if `targetProgression` has been set so that un-activated goals cannot be claimed
* *CHANGE* `Goal.Deactivate()` no longer resets the saved data of a `IGoal`, the state of the `IGoal` will be preserved. See UPGRADENOTES.md for more details.
* *FEATURE* `Goal.Reset()` has been added. This method will deactivate a `IGoal` and reset it's saved data.
* *FEATURE* `ResetGoalStateAction` has been added to ensure that manipulation of saved data occurs within a `IStateAction`.
* *CHANGE* Goals now resolve entities on `Activate()` instead of on `Initialize()` to support global loading of Goals.

### Loading
* *REMOVE* Removed `ContentDataAddedAction` and `ContentDataRemovedAction` from `ClearContentDataLoadPhase` and `LoadContentDataLoadPhase` respectively. Services now listen to `StaticDataAddedAction` and `StaticDataRemovedAction` instead.

### Milestone
* *FEATURE* Added `IActivatable` interface member `activatableData` to `Milestone` class
* *FEATURE* Added `isActive` flag to `Milestone` and `MilestoneSavedData`
* *FEATURE* Added `Reset` method to `IMilestone` in order to denote resetting (wipe saved data).
* *FEATURE* `ModifierService` now supports loading and unloading of Global modifier formulas and Content specific modifier formulas. Modifier formula entities are also loaded by the service when `IModifierFormulaData` are loaded.
* *CHANGE* `ModifierService` now subscribes to `StaticDataAddedAction` and `StaticDataRemovedAction` instead of `ContentDataAddedAction` and `ContentDataRemovedAction`. This ensures that global modifier formulas are not unloaded when switching content.

### PlotPoint Runtime
* *CHANGE* If `Pause()` is invoke on the `PlotPointController` in the middle of playing a plotpoint, it would finish playing the current plotpoint and then pause.

### Projection Service
* *FEATURE* Added `ProjectionService.RefreshPayoutProjections()` to re-calculate the current `IPayoutProjection`s.

### Random Service
* *FEATURE* Added `RandomService` that handles all random number generation. The functionality can be overriden to generate these values from the backend.
* *CHANGE* All calls using `System.Random` in entities, services, and actions have been replaced to calls to the `RandomService`.

### Reward
* *FEATURE* `RewardService` now supports loading and unloading of Global rewards and Content specific rewards. Reward entities are also loaded by the service when `IRewardData` are loaded.
* *CHANGE* `RewardService` now subscribes to `StaticDataAddedAction` and `StaticDataRemovedAction` instead of `ContentDataAddedAction` and `ContentDataRemovedAction`. This ensures that global rewards are not unloaded when switching content.
* *FEATURE* `CurrencyReward`, `BaseRandomCurrencyReward` now supports reward values (almost) up to `max.double`, see `RandomService` for `Random.NextDouble()` limitations.
* *CHANGE* All calls using `System.Random` have been replaced to calls to the `RandomService`.

### Standard Content
* *CHANGE* Duplicate functionality of trade, timerTrunk, and timedBoost has been abstracted into the `StandardContentFeatures` component inside the `StandardContent`, and `StandardEventContent`.

### Timed Activatable
* *FEATURE* Introduced Timed Activatable related classes that inherit from the new `ITimedActivatable` interfaces.
* *FEATURE* Introduced the abstract `TimedTrack` entity, which is a `TimedEntity` with an `ITrack` as its activatable, as well as concrete `TimedGoalTrack` and `TimedMilestoneTrack` entities.

### Timer Service
* *CHANGE* `ITimerListener.UpdateProgression(1f)` is called by the `TimerService` before `ITimerListener.OnTimerEnded(long)` in the `ITimerListener` evaluation logic. All implementations of `ITimerListener` will receive `UpdateProgression(1f)` before `OnTimerEnded(long)` is called.
* *CHANGE* Non-looping `ITimerListeners` are automatically unsubscribed by the `ITimerService` before `ITimerListener.OnTimerEnded(long)` is called. `ITimerListener` no longer needs to unsubscribe itself from the `ITimerService` on `OnTimerEnded(long)`.

### Track
* *FEATURE* Introduced Track Entity related classes that inherit from the new ITrack interfaces.
* *FEATURE* Added new Track Entity Types:
    * Track: Provides base functionality for all concrete Track implementations
    * Goal Track: A Track that contains only `IGoal`s, the track progresses when the active `Goal` is claimed.
    * Passive Goal Track: A Track that contains only `IGoal`s, the track progresses when the active `Goal` can be claimed.
    * MilestoneTrack: A Track that contains only `IMilestone`s

### Trade
* *CHANGE* All calls using `System.Random` have been replaced to calls to the `RandomService`.

### idlekit-tools
### Data Asset Importer
* *FEATURE* Added functionality to import Track and Timed Entity data.

### Debug Tools
* *BUGFIX* Fixed clicking `Ascend` in the debug ascend tool in `ev-FB_content` would hang the game.

### Events
* *CHANGE* `CanvasEventView` and `CanvasReturnToMainContentView` has been updated to support the new `IEventSettings.SetEventDuration()` functionality.

### Goal
* *FEATURE* Added `CanvasGoalView.SetActiveGoalView` to change the progress bar fill color of active / inactive goals
* *FEATURE* Goal UI now shows the current progression and target progression of each Goal.

### Guid Reference
* *CHANGE* `GuidReference` dropdowns in all the Unity Inspector views have been updated to show the `IStaticData.id` instead of the filename of the `IGuidReferenceableAsset`.

### Timed Entity
* *FEATURE* Added TimedEntityPanel which contains the Track panels.

### Track
* *FEATURE* Added GoalTrackPanel and MilestoneTrackPanel for the track feature.
* *FEATURE* Added track data field in `SimpleEntitiesDatabase` for the track feature
* *FEATURE* Added `CanvasGoalTrackPanel` and `CanvasMilestoneTrackPanel` to display a Goal Track or Milestone Track

### UI
* *FEATURE* Information on whether the user has seen an `EventEnd` popup is being reset in `IStartup.ResetGame(bool)`.

### idlekit-examples
### Synchronous Loading
* *FEATURE* The Synchronous Loading example has been repurposed into a First Scene tutorial. See the tutorials section http://docs.idlekit.io for more information.

### Track
* *FEATURE* Added a Track example which shows how the Timed Entity and Tracks could be used.

### idlekit-showcase
### Events
* *CHANGE* Showcase Event UI has been updated to support the new `IEventSettings.SetEventDuration()` functionality.

## Version 1.1.1, 2020-06-01

### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
* N/A

### idlekit-implementation
* N/A

### idlekit-tools
### Unit Tests
* Small fixes to unit tests to resolve issues in Unity 2019

### idlekit-examples
* N/A

### idlekit-showcase
### Balance Data
* *CHANGE* Data changes to resolve a bug where `TimedBoost`s were not being applied in maingame `Content`. See DATACHANGELOG.md for details.

## Version 1.1.0, 2020-05-25

### idlekit-logging
### Test Logger
* *CHANGE* `TestLogger.LogError` now calls `Debug.LogError` to break the execution of tests in Unity unless `ignoreFailingMessages` is set to true. This is to ensure error logs are properly tested in unit tests.

### idlekit-ioc
* N/A

### idlekit-framework
### Action
* *FEATURE* Added the ability to specify the priority the listeners(subscribers) get called, in the `IActionService.Subscribe<T>(Action<T> listener, object instance, int priority)` method. The listener with the higher priority will get called first when an `IAction` is dispatched.
* *CHANGE* The delegate type `ActionHandler<T>` has been removed, use C#'s `Action<T>` instead. All functions that require `ActionHandler<T>` have been updated to use `Action<T>`. Since the signatures of `ActionHandler<T>` and `Action<T>` are the same, no client code change is required.
* *CHANGE* `IAction.dispatchAs` has been renamed to `IAction.typesToDispatchAs` for consistency and to fix a class generation tool issue.

### Container
* *FEATURE* Added `UnbindIKInstaller` to the `IIKMonoInstaller` to cleanup the `IIKInstaller` component in the `IIKMonoInstaller`.
* *FEATURE* Added `IActionResolver` which is an `ITypedResolver` similar to `IEntityResolver` to limit the access to provide resolution of `IActions`.

### Currency
* *FEATURE* Added `void Cleanup()` to `CurrencyAmount` struct for cleanup purpose.

### Data Loader
* *FEATURE* Added `void ClearData(IStaticData)` and `void ClearData(IStaticData[])` for unloading `IStaticData` from the `IContainer`. All implementations of `IDataLoaderService` have been updated.
* *CHANGE* `void LoadData(IStaticData,bool)` and `void LoadData(IStaticData[], bool)` have been changed to `void LoadData(IStaticData)` and `void LoadData(IStaticData[])`. See UPGRADENOTES.md for details.

### Event Settings
* *REMOVE* Removed `IEventSettings.CompleteMilestone` as this functionality should be performed via a `CompleteMilestoneStateAction`.
* *FEATURE* Added convenience method `MilestoneCompletionInfo GetMilestoneCompletionInfo(string)` to `IEventSettings`.

### Generator
* *CHANGE* `void Collect(int)` has been changed to `void Collect(long)` to support a larger number of collections.

### Loading
* *FEATURE* Added new `IAdvanceStageLoadPhase` `ILoadPhase` that is responsible for moving the player to the next available `IStage`. It can also be used to load `Stage` specific assets.
* *FEATURE* Added new `IClearContentDataLoadPhase` `ILoadPhase` that is responsible for clearing all `IStaticData` associated with an `IContent`.
* *FEATURE* Added new `IClearGlobalDataLoadPhase` `ILoadPhase` that is responsible for clearing all global `IStaticData`.
* *FEATURE* Added new `IClearContentIdLoadPhase` `ILoadPhase` that is responsible for clearing the `IUserSavedData.contentInstanceId`.
* *FEATURE* Added new `ISetContentIdLoadPhase` `ILoadPhase` that is responsible for determining and setting up the `IUserSavedData.contentInstanceId` that the game is going to load.

### Projection Service
* *FEATURE* Added `IProjectionService` and `IProjectionCalculator` to get projections of `CurrencyAmount` earned over a period of time or completion timestamp to reached a certain `CurrencyAmount` without player input.
* *FEATURE* Added `IPayoutProjection` model class that represents the `ICurrency` generation rate of the game before an expiration timestamp. This is useful to calculate currency earnings before an `ITimedBoost` expires.

### Serializer
* *FEATURE* Added `void DeleteAll()` to the `ISerializer` to delete all `ISavedData` at runtime. All implementations of `ISerializer` have been updated.

### Startup
* *FEATURE* Added `void ResetGame(bool)` feature to allow in app reset.
* *CHANGE* `void StartGame(IContext)` has been changed to `void StartGame()`. All implementations of `IStartup` have been updated.
* *FEATURE* If the player was going to start the game in an expired/complete `EventContent`, the game would now start the player in the `MainGame`.

### Timer Listener
* *CHANGE* `void OnTimerEnd(int count)` has been changed to `void OnTimerEnd(long count)` to support a larger number of collections. See UPGRADENOTES.md for details.

### idlekit-implementation
### Action
* *CHANGE* Performed a cleanup pass on all `IAction` and `IStateAction` to prevent memory leak using the following guidelines:
    * All injected protected variables should be set to null on `void ResetEvent()`
    * All cached properties should be `Clear()` and set to null on `void Cleanup()`
* *REMOVE*  `StaticDataAddedAction` and `StaticDataRemovedAction` have had the `bool contentSpecific { get; set; }` flag removed. See UPGRADENOTES.md for details.
* *CHANGE* `IAction.dispatchAs` has been renamed to `IAction.typesToDispatchAs` for consistency and to fix a class generation tool issue, which impacts all actions and state actions.
* *FEATURE* Added `SetProjectedMilestoneCompletionStateAction` which should be dispatched when setting `IMilestone` projected completion timestamps in `IEventSettingsSavedData`.
* *CHANGE* The `CompleteMilestoneStateAction` now validates that the `IMilestone` can be completed prior to changing saved data.
* *CHANGE* Passing a null instance to `ActionService.Unsubscribe` now generates a warning. See UPGRADENOTES.md for details.

### Activity Tracking
* *REMOVE* `Milestone` projection logic has been moved to `EventService`. See `Milestone Projection` section below for details.

### Data Loader
* *CHANGE* `DataLoaderService` no longer automatically unload `IStaticData` on `ClearContentStateAction` and `void Cleanup()`. They are now unloaded in `IClearGlobalDataLoadPhase` and `IClearContentDataLoadPhase`.
* *FEATURE* Added `ContentDataAddedAction` and `ContentDataRemovedAction` which are being listend to by `CurrencyService`, `ModifierService`, and `RewardService` to load `ICurrencies`, `IModifierFormulas`, and `IRewards`. The services no longer listen to `SetContentStateAction` and `ClearContentStateAction`.

### Economy Service
* *CHANGE* EconomyService.GetDuration now logs an error instead of a warning when generator duration is too high or too low.

### Entity
* *CHANGE* Perform a cleanup pass on all `IEntity` to prevent memory leak using the following guidelines:
    * All injected protected variables should be null and loaded `IEntity` should be unloaded on `void Cleanup()`
    * All cached collections should be `Clear()` and set to null on `void Cleanup()`

### Event Settings
* *REMOVE* Removed `EventSettings.CompleteMilestone` as this functionality should be performed via a `CompleteMilestoneStateAction`.
* *CHANGE* `EventSettings.SetMilestoneCompletionTime` now broadcasts a `SetProjectedMilestoneCompletionStateAction` rather than directly manipulating saved data.
* *CHANGE* `EventSettingsSavedData.CompleteMilestone` will now log an error if an invalid `milestoneId` is passed.

### Generator
* *FEATURE* Added `long minimumUpdateInterval { get; set; }` to `AutoCollectState` so the user can set the minimum collection interval for testing instead of using a constant 500 milliseconds.

### Milestone Projection
* *CHANGE* `Milestone` projection logic has been moved from `ActivityTrackingService` into `EventService` utilizing the new `ProjectService` to calculate the completion time of the `Milestones` without any player input.

### Plot Point
* *CHANGE* `PlotPointService` now implements `BindingService` so it can bind and unbind `PlotPoint` related entities with their base types.

### SerializationService
* *FEATURE* Added `void ResetUser()` to facilitate in app reset.

### Service
* *CHANGE* Performed a cleanup pass on all `IService` to prevent memory leak using the following guidelines:
    * All injected protected variables should be null and loaded `IEntity` should be unloaded on `void Cleanup()`
    * All cached collections should be `Clear()` and/or set to null on `void Cleanup()`

### Timer
* *BUGFIX* Fixed a bug where recursively calling `TimerService.EvaluateListener` would throw an index or null exception if the `listeners` in `TimerService` have been modified.

### idlekit-tools
### Action
* *CHANGE* An issue with the class generation tool extending actions and state actions has been fixed by renaming`IAction.dispatchAs` to `IAction.typesToDispatchAs` for consistency

### Data Asset Importer
* *FEATURE* Added an input folder and `Generate Paths` option, which matches each data asset with its corresponding csv files.
    * This functionality only supports the default IdleKit csv naming format, e.g. !!!AscensionReward!!!.
    * To change the csv file name recognition, please change `SimpleDataAssetImporterEditorWindow.GetFormattedTypeName()`

### Plot Point
* *BUGFIX* Solved a bug that the ascension completion plotpoint would not be played if an event ends while during the ascension gameplay.

### UI
* *CHANGE* Perform a cleanup pass on all UI code to prevent memory leak using the following guidelines:
    * All injected protected variables should be null and loaded `IEntity` should be unloaded on its cleanup method.
    * All cached collections should be `Clear()` and set to null on its cleanup method.
* *FEATURE* Added `CanvasDebugResetGameTool` and the UI reset game debug tool, which has the option to reset all the `ISavedData`.

### idlekit-examples
* *CHANGE* Updated `SynchronousLoading` example to override `SwitchStage()` now the base method uses async loadphases.

### idlekit-showcase
* N/A

## Version 1.0.1, 2020-04-20
### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
* N/A

### idlekit-implementation
### Activity Tracking Service
* *CHANGE* Changed the interval at which `IMilestone` projection logic runs to once every 15 seconds.

### Economy
* *BUGFIX* Removed `Economy.MIN_GENERATOR_DURATION`, `Economy.GetDuration()` will use `GeneratorBalanceData.MIN_DURATION` instead.
* *BUGFIX* `Economy.GetDuration()` will return `long.MaxValue` if generator duration is too large.

### Event Content
* *BUGFIX* `CleanupActiveMilestone()` is now called when the Event ends to prevent further invalid progress.

### Generator
* *BUGFIX* `AutoCollecState.collectDuration()` now properly returns a collect duration which is the closest multiple of `IGeneratorEntity.duration`.
* *BUGFIX* `CollectFromGeneratorPlayerEvent.Apply()` now accounts for collections that aren't at current timestamp. This resolves a bug where resuming back into the app would not result in the correct production start timestamp for Generators that collected while offline.

### PlotPoint
* *BUGFIX* Fixed an issue where the PlotPointController sequenceQueue was not properly cleared on Cleanup().

### idlekit-tools
### Class Generation Tool
* *BUGFIX* Resolved an issue where it was possible to extend test Entities in the `Tools.Editor.Tests` namespace.
* *BUGFIX* Resolved a number of issues in the `EntityBuilder` and `ServiceBuilder` where incorrect base interfaces were being calculated.

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

## Version 1.0.0, 2020-03-10
### idlekit-logging
* *FEATURE* This repo has been added to contain any functionality related to `IdleKitLog`, `IPriorityLogger` and it's implementations. This repo has no dependencies and is used by all other idlekit repos.

### idlekit-ioc
* *FEATURE* This repo has been added to contain any functionality related to dependency container (`IContainer` and it's implementations). This repo depends on `idlekit-logging` and is used by all other idlekit repos.

### idlekit-framework

### Action Service
* *CHANGE* `IEventService` has been renamed to `IActionService`.
* *CHANGE* `IActionService.Subscribe<T>(ActionHandler<T> listener, object instance)` no longer has a `null` default value for `instance`.
* *CHANGE* Added `IActionService.Subscribe<T>(ActionHandler<T> listener)` to allow implementations to subscribe globally.
* *FEATURE* Added `IActionService.Dispatch<T>(object instance = null)` to allow dispatching `IAction` without the `IAction` object. This should not be used with `IAction`s that need to have their parameters initialized. Calls to `IActionService.Dispatch<T>(T actionTrigger, object instance =null)` that do not need the `IAction` to be initialized are now using this new method.

### Boost
* *FEATURE* Introduced interfaces for the Timed Boost Entity; `ITimedBoost`, `ITimedBoostData`, `ITimedBoostSavedData`, `ITimedBoostDataAsset`.

### Character
* *REMOVE* Removed `ICharacter`, `ICharacterData`, `ICharacterSavedData` and `ICharacterDataAsset`. This functionality will return in the form of a more generic association data in the future. Please refer to the `UPGRADENOTES.md` for more details.

### Content
* *FEATURE* `IShowcaseContent` has been moved to framework and renamed `IStandardContent`.
* *FEATURE* `IShowcaseEventContent` has been moved to framework and renamed `IStandardEventContent`
* *CHANGE* `IStandardContent.missingResourcesExchangeRateMultiplier` has been split into `softCurrencyMissingResourcesMultiplier` and `upgradeableCurrencyMissingResourcesMultiplier`
* *CHANGE* `IStandardContentData.missingResourcesExchangeRateMultiplierId` has been split into `softCurrencyMissingResourcesMultiplierId` and `upgradeableCurrencyMissingResourcesMultiplierId`

### Continuous Integration
* *FEATURE* Added a continuous integration script under `Builder/Jenkinsfile` that serves as an example on how to setup a Jenkins Multi-branch Pipeline with IdleKit.

### Currency
* *CHANGE* A `setAvailable` bool has been added to `CurrencyAmount` to signal that the `Currency.available` flag should be set when the `CurrencyAmount` is processed.

### Currency Service
* *REMOVE* Removed `ICurrencyService.ValidateAddCurrencyAmount(string id, double amount)` and `ICurrencyService.ValidateRemoveCurrencyAmount(string id, double amount)`. Refer to the `UPGRADENOTES.md` for more details.
* *FEATURE* Utility methods `ICurrencyService.RemoveCurrencyAmount(CurrencyAmount amount)`, `ICurrencyService.AddCurrencyAmount(CurrencyAmount amount)` and `ICurrencyService.SetCurrencyAmount(CurrencyAmount amount)` have been added.

### Dependency Container
* *FEATURE* Introduced IdleKit's own dependency solution that allows the user to bind a type, instance, or method to different types of dependency with an optional Id and various scopes. When the dependency is required, an instance of the dependency will be provided by the container and it's dependencies will be injected if it implements the `IInjectable`.
* *FEATURE* All the dependency container code is located in a separate repository at `git@github.com/Idlekit/idlekit-ioc.git` in its own name space `IdleKit.IoC`.
* *CHANGE* The entire IdleKit codebase - the `IEntity`, `IAction`, `IService`, and UI code have been refactored to work with the container.
* *CHANGE* Please refer to the documentation `http://docs.idlekit.io` for the various components of the dependency container and the details of the integration.
* *REMOVE* The previous `IDependencyContainer` class has been deprecated.

### Entity
* *FEATURE* `IEntity` initialization flow has been refactored. Please refer to the `UPGRADENOTES.md` for more details.
* *FEATURE* Introduce `void Initialize()` to the lifecycle of all `IEntity` to perform any setup logic including the subscription to `IAction`s.
* *CHANGE* `IEntity.Cleanup(IEntity)` method on all `IEntity` is now responsible for cleaning up all its child `IEntities` and other object references it may receive during its lifetime (i.e: `IServices`, `IEntityData`...etc).
* *CHANGE* Changed all `IEntityDataAsset` interfaces to pass through a generic Type that must implement `IStaticData`. This allows Data Assets to be much more specific about the data they contain while also allowing them to extend other Data Assets. This also means extended Data Assets are forced to pass data that has also extended a base which means things are more consistent.

### Event
* *FEATURE* Introduced `string uniqueContentId { get; }` for `IEventSettingsData` so different `IEventSettings` can have an unique id for the `IEventContent` that is associated with the `IEventSettings`. Consequently, each `IEventSettings` is now working with `IEventContent.instanceId` so its `IStaticData` can be reused for another event (`IEventSettings`).
* *FEATURE* Introduced `void CompleteEvent()` for `IEventSettings` and `IEventSettingsSavedData`, which marks the event (`IEventSettings`) as completed.
* *CHANGE* Renamed `OfflineProgressAction` to `OfflineProgressStartAction` to mark the beginning of the Offline Activity Tracker process.
* *FEATURE* Introduced `OfflineProgressEndAction` to mark that the Offline Activity Tracker catch-up process is complete.

### Event Content
* *BUGFIX* The next `Milestone` is no longer initialized with the previous `Milestone`'s progress if they are not tracking the same `currencyId`.

### Event Content Service
* *CHANGE* `IEventContentService` has been renamed to `IEventService`. The previous `IEventService` has been renamed to `IActionService`.

### Event Service
* *CHANGE* `IEventService` has been renamed to `IActionService`.
* *REMOVE* `bool CanClaimRewards(string)` and `void ClaimRewards(string)` have been removed from the `IEventContentService`. Refer to the `UPGRADENOTES.md` for more details.

### Generator
* *CHANGE* Removed references to `ICharacter` and `ICharacterData` in `IGeneratorEntity` and `IGeneratorData`.

### Goal
* *FEATURE* `IGoalSavedData` now stores whether it has been claimed or not.
* *CHANGE* `GoalDataSequence` is no longer a `struct`. It is a `class` now because it contains mutable property in `string[] goalIds { get; }`.
* *CHANGE* `IGoal.normalizedProgress` and `IGoalSavedData.normalizedProgress` now return a double instead of a float

### Offline Activity Tracker
* *FEATURE* Once the offline catch-up process is complete, an `OfflineProgressEndAction` will be broadcast.

### Loading
* *FEATURE* Added `IAsyncLoadable` and `IAsyncLoader` interfaces. These will help consolidate loading operations into more manageable processes with more feedback.

### Logging
* *CHANGE* All Logging related code has been moved into a new repository at `git@github.com/Idlekit/idlekit-logging.git`. Refer to the `UPGRADENOTES.md` for more details.

### Milestone
* *REMOVE* `IMilestoneData.rewardId` has been removed as it served no purpose. See `UPGRADENOTES.md` for details.
* *FEATURE* Added `double currentProgress { get; }` and `bool canClaim { get; }` to `IMilestone`, and `double progression { get; }` and `void SetProgressiong(double)` to `IMilestoneSavedData` so they function more similarly to `IGoal` and `IGoalSavedData`.
* *CHANGE* `IMilestone.normalizedProgress` now returns a double instead of a float

### Modifier
* *REMOVE* `IModifier` no longer implements `IEntity`.
* *CHANGE* `IModifierData` is no longer `IComparable`.
* *REMOVE* `IModifierData.Initialize(IModifierCategoryData modifierCategoryData)` has been removed.
* *REMOVE* `IModifierData` no longer keeps a reference to a `ModifierCategoryData`.
* *REMOVE* `IModifierData.priority` has been removed. The new `IModifierFormula` handles priority implicitly.
* *CHANGE* `IModifierCategoryData` and `IModifierCategoryDataAsset` have been renamed to `IModifierGroupData` and `IModifierGroupDataAsset`.
* *FEATURE* Added `IModifierFormula`, `IModifierFormulaData` and `IModifierFormulaDataAsset`.
* *FEATURE* Added `IModifierFormulaParser`.
* *CHANGE* Methods in `IModifierCache` that used to use `IModifierCategoryData` types now use `IModifierFormula` types.
* *REMOVE* `IModifierCache` no longer holds a list of all registered `IModifiers` and `IModifiables`
* *REMOVE* `IEnumerable<ModifierSearchResult> SearchModifiersAffectingModifiable<TModifierCategoryData>(string modifiableId, bool checkCanBeApplied = true)`, `IModifierCache.GetModifier(string modifierId)` and `IModifierCache.GetModifiable(string modifiableId)` have been removed
* *CHANGE* Added `IEnumerable<IModifiable> IModifierCache.GetModifiablesAffectedByModifier(Type modifierFormulaType, string modifierId)` and `IEnumerable<IModifierGroupData> IModifierCache.GetModifierGroupDatasByModifierFormula(Type modifierFormulaType)`.
* *CHANGE* Methods in `IModifierService` that used to use `IModifierCategoryData` types now use `IModifierFormula` types.
* *CHANGE* Added `IModifier[] IModifierService.GetModifiersAffectingModifiable(Type modifierFormulaType, string modifiableId)` and `IModifiable[] IModifierService.GetModifiablesAffectedByModifier(Type modifierFormulaType, string modifierId)`.
* *REMOVE* Deleted `ModifierSearchResult`. This functionality is now handled by `IModifierGroupData` and `IModifierFormula`.

### Namespaces
* *CHANGE* The following namespaces have been renamed as follows:
     * `IdleKit` to `IdleKit.Framework`
     * `IdleKit.PlotPoint` to `IdleKit.Framework`

### PlotPoint
### Data
* *FEATURE* Introduce generic typed version of `IPlotPointDataAsset` that allows implementations to have a strongly type `data` variable.
* *REMOVE* `IPlotPointSequenceCollectionData.StartActivators` and `IPlotPointSequenceCollectionData.Cleanup` have been removed as it is now a pure data class. The functionality is moved into `IPlotPointService`.

### Activation
* *CHANGE* `IPlotPointActivationCondition` has been incorporated into the `IContainer` and became `IInjectable` therefore the previous `IPlotPointActivationCondition.Start` method has been eliminated.
* *FEATURE* Added `Subscribe` and `Unsubscribe` to `IPlotPointActivationCondition` to deal with subscribing and un-subscribing to the `IActionService`.
* *REMOVE* `IPlotPointActivatorData.Start` and `IPlotPointActivatorData.Cleanup` have been removed as the `IPlotPointService` is now in charge of creating and injecting the `IPlotPointActivationCondition`.
* *CHANGE*  All the implementing classes have been updated accordingly with the above changes.

### Runtime
* *CHANGE* `IPlotPointService` interface has been refactored. It is now in charge of managing all plot point related features during runtime and cleanup of the activated `IPlotPointSequenceCollectionData` for the current `IStage`.
* *CHANGE* `IPlotPointDataProvider.Clear` has been renamed to `IPlotPointDataProvider.Cleanup`.
* *REMOVE* `IPlotPointDataProvider.SendDataAddedAction` has been removed. `LoadPlotPointsDataLoadPhase` in `idlekit-tools` is now in charged of firing the action `PlotPointsLoadedAction`.
* *CHANGE*  All the implementing classes have been updated accordingly with the above changes.
* *CHANGE* `IPlotPointController` interface has been refactored to remove unnecessary functionality and added more C# event callbacks. Visit the `UPGRADENOTES.md` for details.

### Reward
* *FEATURE* Added new `IReward` types:
     * `ICurrencyUnlockReward`
     * `IRandomUnobtainedCurrencyReward`
* *FEATURE* Added new `IRewardData` types:
     * `ICurrencyUnlockRewardData`
     * `IRandomUnobtainedCurrencyRewardData`
     * `IFallbackRewardData`
     * `ITagRewardData`
* *CHANGE* Changed the name of `IRandomTagsCurrencyReward` to `IRandomObtainedCurrencyReward` and removed all `allowUnobtained` references from it. `IRandomTagsCurrencyRewardData` was changed to `IRandomObtainedCurrencyRewardData`.
* *CHANGE* Moved `AscensionRewardGroup` from `idlekit-implementation` to `idlekit-framework` since an interface references it.
* *CHANGE* `ITimedRewardSavedData` and related classes have been converted due to the replacement of `long timeStarted {get; }`, and `bool neverClaimed { get; }` with `long timeComplete { get; }` and `bool hasStarted { get; }`. It is done so the class can be more consistent with the other timer related classes.
* *CHANGE* `IGachaReward.GetValidItems` now takes an optional `ignoreFallback` flag.
* *CHANGE* `IReward.CanClaim` now takes an optional `ignoreFallback` flag.
* *FEATURE* `IShowcaseTimerTrunk` has been moved to `idlekit-framework` and renamed `ITimerTrunk`.

### Serializer
* *FEATURE* Added `bool hasDirtyData { get; }` so it can be more efficient in determining if on-disc serialization needs to take place.

### Services
* *CHANGE* Renamed the following Service interfaces to better fit naming conventions.
    * `ICurrencyManager` was renamed to `ICurrencyService`
    * `IEconomy` was renamed to `IEconomyService`
    * `IEntityLoader` was renamed to `IEntityLoaderService`
    * `IEventManager` was renamed to `IActionService`
    * `IEventContentManager` was renamed to `IEventService`
    * `IModifierManager` was renamed to `IModifierService`
    * `IPlotpointManager` was renamed to `IPlotpointService`
    * `IRewardManager` was renamed to `IRewardService`
    * `IStaticDataLoader` was renamed to `IDataLoaderService`

### Stage
* *REMOVE* Removed `IStageData.startCurrencyId` and `IStageData.startCurrencyAmount`.
* *CHANGE* Added `IStageData.startingCurrencyAmounts`.

### Startup
* *FEATURE* Added `IStartup` interface to help manage the game boot flow.
* *FEATURE* Added `IPhaseLoader` interface. This can be implemented to help manage the game boot flow.
* *FEATURE* Added `ILoadPhase` interface. This interface will allow you to split game initialization into multiple load phases.
* *FEATURE* Added the following `ILoadPhase` extensions that define typical game boot and content switch sequences:
    * `IInitializeUserLoadPhase`
    * `ILoadGlobalDataLoadPhase`
    * `IProcessEventsSavedDataLoadPhase`
    * `ILoadContentDataLoadPhase`
    * `ILoadContentLoadPhase`
    * `IClearContentLoadPhase`

### Static Data
* *CHANGE* `IDataLoaderService` is now able to load global data that do not get cleared between `IContent` using `IDataLoaderService.LoadData(IStaticData, bool)`.

### Time Service
* *FEATURE* Add `DateTime systemTime { get; }`, and `long systemTimestamp { get; }` to allow setting of the current UTC time used in non-game specific functionality such as calculating the time the user is offline.
* *CHANGE* The previous timestamp related functionality has been renamed to `DateTime gameTime { get; }`, `long gameTimestamp { get; }` and `void SetGameTimestamp(long)`. Please the `UPGRADENOTES.md` for more details.

### Trade
* *CHANGE* `GetRandomValidTrade` has now been added to the `ITradeService` to get a valid trade from a random pool of `ITrade`s.
* *CHANGE* `ITrade.MakeTrade()` now returns a boolean value depending on whether or not the trade was successfully made.
* *CHANGE* `ITrade` now dispatches `TradeAcceptedAction`s and `TradeDeclinedAction`s based on player actions.

### Trade Service
* *FEATURE* Added a `GetRandomValidTradeFromPool` method to `ITradeService` to get a valid `ITrade` from a given pool of `ITrade`s.

### Unity
* *CHANGE* Upgraded Unity support to 2018.4.18f1.

### Unlockable
* *CHANGE* `IUnlockable` now requires `SetAvailability` and `SetObtained` methods to be implemented, see `UPGRADENOTES.md` for details.
* *CHANGE* `IUnlockableSavedData` now requires a `SetObtained` method to be implemented.
* *REMOVE* `IUnlockableData` has been removed. See `UPGRADENOTES.md` for details.

### User
* *FEATURE* `long GetLastActivityTime` is added to the `IUserSavedData` to get the timestamp of the last user activity in the current `IContent`
* *FEATURE* `void SetLastActivityTime(long)` is added to the `IUserSavedData` to set the timestamp of the last user activity in the current `IContent`

### idlekit-implementation
### Action
* *CHANGE* `IEvent` and related classes have now been renamed to `IAction`.
* *CHANGE* `IPlayerEvent` and related classes have now been renamed to `IStateAction`.
* *CHANGE* `NewContentStateAction` now sets the `ContentSavedData.currentStageId`.
* *CHANGE* `LogLastActiveTimeStateAction` no longer requires the current `IContent`. Instead, it requires a `IUserSavedData` to store the user's last active time.
* *CHANGE* Added `ModifierChangedAction` which denotes whenever a `IModifier` state has changed (activation, index change, etc).
* *CHANGE* Added `ModifierToggledAction` which indicates when a `IModifier` has been activated/deactivated.
* *CHANGE* `ToggleTimedBoostStateAction` and `ToggleBoostStateAction` now inherit directly from `ModifierToggledAction`.
* *CHANGE* `CurrencyObtainedAction` now stores a flag denotes whether the `obtained` flag was set to true or false.
* *CHANGE* Added `CurrencyAvailableAction` to denote when the `available` flag on an `ICurrency` has been set.
* *REMOVE* `StageSelectedAction` has been removed. See the `UPGRADENOTES.md` for details.
* *BUGFIX* The dispatch types of `ToggleTimedBoostStateAction` have had the incorrect type of `ToggleBoostStateAction` removed.
* *REMOVE* `OpenTimerTrunkStateAction` has been removed. Please see the `UPGRADENOTE.md` for details.
* *CHANGE* Renamed `GeneratorUnitTargetHitAction` to `GeneratorModifierIndexChangedAction`.
* *CHANGE* `IncrementGeneratorUnitStateAction` no longer extends `GrantRewardStateAction`. All reward logic is now handled in `GeneratorUnitTargetHitStateAction`.
* *FEATURE* Added new `GeneratorUnitTargetHitStateAction` which extends `GrantRewardStateAction`.
* *CHANGE* Moved all ascension related save data changes, aside from rewards, from `AscensionCompleteStateAction` to `AdvanceStageStateAction`. See the `UPGRADENOTES.md` for details.
* *CHANGE* Added a `IContent` field to `IdleKitInitializedAction`.
* *CHANGE* The `EventStartedAction` and `EventEndedAction` have are now `IStateAction`s and have been renamed `EventStartedStateAction` and `EventEndedStateAction`.
* *CHANGE* The `GrantRewardStateAction.Apply` method will now set the availability of a currency as specified via a `IReward.CalculateRewards` method.
* *CHANGE* Rewards that have been claimed by the `GrantRewardStateAction` will now be output to the Unity log.
* *CHANGE* The protected `GrantRewardStateAction.CalculateReward` and `AscensionCompleteStateAction.CalculateReward` methods have been removed.
* *CHANGE* `TimerTrunkUnlockedPlayerAction` has been moved from `idlekit-showcase` into `idlekit-implementation`.
* *FEATURE* Added the following new `TradeAction`s:
    * `TradeActivatedAction` is broadcast when an `ITrade` is successfully activated
    * `TradeDeactivatedAction` is not currently broadcast but can be sent if an `ITrade` should be automatically deactivated
    * `TradeAcceptedAction` is broadcast when a player has successfully completed the active `ITrade`
    * `TradeDeclinedAction` is broadcast when a player declines the active `ITrade`
    * `ToggleActiveTradeStateAction` is broadcast when an `ITrade` is activated or deactivated in an `IStandardContent`.
* *CHANGE* `AdvanceStageStateAction` now checks that `Content.nextStageId` is not null or empty before setting `ContentSavedData.currentStageId`. See UPGRADENOTES for more information on this.

### Action Service
* *CHANGE* The `EventService` has been renamed to `ActionService`.
* *CHANGE* `ActionService.Subscribe<T>(ActionHandler<T> listener, object instance)` will log an error if `instance` is null. Previously it would add a global subscription in this case.
* *CHANGE* `ActionService.Subscribe<T>(ActionHandler<T> listener)` has been added to subscribe globally to actions.

### Activity Tacking Service
* *CHANGE* Due to the refactor of the `IEntity` initialization flow, the service now sets the timestamp of the `ITimerService` on `SetContentPlayerAction` instead of the `ContentInitializedAction`.
* *CHANGE* Due to the refactor of the `IEntity` initialization flow, the service now evaluates the expired `TimerSubscriptions` of the `ITimerService` on `ContentInitializedAction` instead of the `StageInitializedAction`.

### Boost
* *CHANGE* Various fields in `Boost` and `TimedBoost` static data have been updated as a result of the addition of asset creators for Boosts and TimedBoosts. See UPGRADENOTES.md for more details.
* *CHANGE* Timed Boost Entity related classes now inherit from the new interfaces in idlekit-framework (`ITimedBoost`, `ITimedBoostData`, `ITimedBoostSavedData` `ITimedBoostDataAsset`).
* *CHANGE* `TimedBoost.isActive` no longer overrides `Boost.isActive` for consistency. The `isActive` flag is set via the `ToggleTimedBoostPlayerAction` in the same way as in the `ToogleBoostPlayerAction`.
* *BUGFIX* `TimedBoostSavedData` now correctly inherits from `BoostSavedData`.

### Currency Service
* *FEATURE* Utility methods `CurrencyService.RemoveCurrencyAmount(CurrencyAmount amount)`, `CurrencyService.AddCurrencyAmount(CurrencyAmount amount)` and `CurrencyService.SetCurrencyAmount(CurrencyAmount amount)` have been added.

### Character
* *REMOVED* `Character`, `CharacterData`, `CharacterSavedData` and `CharacterDataAsset`. This functionality will return in the form of a more generic association data in the future.

### Core
* *FEATURE* Added an extension method in `CoreExtensions` to get all interfaces and base classes that a class implements and extends.
* *FEATURE* Added an extension method in `CoreExtensions` to help recursively inject dependencies into a root `GameObject`.

### Content
* *FEATURE* `ShowcaseContent` has been moved to implementation and renamed `StandardContent`
* *REMOVED* IdleKit no longer uses `IContentSavedData.timeModified` to store user's last activity time as it is done now in `IUserSavedData.SetLastActivityTime(long)`.
* *CHANGE* `ShowcaseContent` and all its related classes have been renamed to `StandardContent` and moved into `idlekit-implementation`.
* *CHANGE* `StandardContent` and `StandardContentData` now require `videoAdBoostId` properties.
* *CHANGE* `StandardContent` and `StandardContentData` now hold and load a reference of an `Boost`.
* *FEATURE* `StandardContent` and `StandardEventContent` now subscribe to all `TradeAction`s to track the status of a player's active `Trade`.
* *FEATURE* Added `IStandardContentSavedData` and `IStandardEventContentSavedData` which track the status of a player's active `Trade` in a given `StandardContent`.
* *CHANGE* `StandardContent.missingResourcesExchangeRateMultiplier` has been split into `softCurrencyMissingResourcesMultiplier` and `upgradeableCurrencyMissingResourcesMultiplier`
* *CHANGE* `StandardContentData.missingResourcesExchangeRateMultiplierId` has been split into `softCurrencyMissingResourcesMultiplierId` and `upgradeableCurrencyMissingResourcesMultiplierId`
* *CHANGE* `StandardEventContent.missingResourcesExchangeRateMultiplier` has been split into `softCurrencyMissingResourcesMultiplier` and `upgradeableCurrencyMissingResourcesMultiplier`
* *CHANGE* `StandardEventContentData.missingResourcesExchangeRateMultiplierId` has been split into `softCurrencyMissingResourcesMultiplierId` and `upgradeableCurrencyMissingResourcesMultiplierId`

### Continuous Integration
* *FEATURE* Added a continuous integration script under `Builder/Jenkinsfile` that serves as an example on how to setup a Jenkins Multi-branch Pipeline with IdleKit.

### Dependency Container
* *FEATURE* Introduced `IKMonoInstaller` and `IKInstaller` to handle the registration and de-registration of all the dependency specific to IdleKit.

### Entities Database
* *CHANGE* `EntitiesDatabase` has been renamed to `SimpleEntitiesDatabase`. See UPGRADENOTES.md for details.

### Entity
* *CHANGE* `IEntity.Initialize()` is now implicitly called when the `IEntity` is created in the `IEntityLoader` right after `IEntity.Inject(IResolver)` is performed to ensure the dependency is available.
* *CHANGE* All `EntityDataAsset`s have been changed to work with the interface changes outlined above in `idlekit-framework`.
* *CHANGE* Missing interfaces have been added to keep the extended Entities consistent and extensible.
    * `IStandardEventContent`
    * `IStandardEventContentData`
    * `IStandardEventContentDataAsset`
    * `IStandardContentDataAsset`
    * `IStandardUpgradeableCurrencyData`
    * `IStandardUpgradeableCurrencyDataAsset`
    * `IStandardEventSettingsDataAsset`
    * `ITimerTrunk`
    * `ITimerTrunkData`
    * `ITimerTrunkSavedData`

### Entity Loader
* *CHANGE* In `UnbindDerived` the call to `IEntity.Cleanup` is moved to after the `EntityRemoveAction` is dispatched to stay consistent with the `EntityAddedAction`. So the listener of `EntityRemovedAction` can perform the logic before the entity gets cleaned up.
* *CHANGE* `EntityLoader` now tracks the `IEntity` it has loaded or unloaded. It will add or remove it to the `IContainer` accordingly when the `IEntity` is first referenced or have its last reference removed.
* *CHANGE* `EntityAddedAction` is now only called when the first reference to the `IEntity` is created.
* *CHANGE* `EntityRemovedAction` is now only called when the last reference to the `IEntity` is removed.

### Event
* *CHANGE* `IEvent` and related classes have now been renamed to `IAction`. See the `Action` section above for related changes.
* *CHANGE* `IPlayerEvent` and related classes have now been renamed to `IStateAction`.

### Event Service
* *CHANGE* The `EventService` has been renamed to `ActionService`.

### Event Settings
* *CHANGE* The `EventStartedStateAction` is now broadcast after subscription to the TimerService.
* *CHANGE* The `EventStartedStateAction`, `EventEndedStateAction` and `ClaimEventRewardsStateAction` are now broadcast with the `EventSettings` object as their associated instance.

### Event Content
* *BUGFIX* The next `Milestone` is no longer initialized with the previous `Milestone`'s progress if they are not tracking the same `currencyId`.
* *CHANGE* `ShowcaseEventContent` and related classes have been moved to `idlekit-implementation` and renamed `StandardEventContent`.

### Generator
* *CHANGE* The `GeneratorEntity.OnModifierIndexChanged` method has been renamed to `OnModifierAction` and is now called whenever any `Modifier` type action is broadcast.
* *CHANGE* Removed references to `Character` and `CharacterData` from `GeneratorEntity` and `GeneratorData`.
* *CHANGE* When a unit target is reached `GeneratorEntity` will now dispatch both a `GeneratorModifierIndexChangedAction` and a `GeneratorUnitTargetHitStateAction`.
* *CHANGE* `BuyGeneratorStateAction` now makes the `ICurrencies` specified in the `GeneratorData.associatedUpgradeableCurrencyIds` `available` and `obtained`.
* *CHANGE* `IGeneratorEntity.modifierDataIndex` has been set from `generatorUnitTargetHit - 1` to `generatorUnitTargetHit`. Hence, index 0 of the `modifierData.amounts` would be used when the user has achieved 0 `generatorUnitTarget`.

### Goal
* *FEATURE* Introduced a common base class (`GeneratorGoal`) for all `IGeneratorEntity` related goals. The following goals have been refactored to work with the base class.
    * `AutomateGeneratorsGoal`
    * `BuyGeneratorTypeGoal`
    * `CollectFromGeneratorTypeGoal`
    * `GetGeneratorUnitsForAllGeneratorsGoal`
    * `GetGeneratorUnitsForGeneratorTypeGoal`
    * `GetGeneratorUnitsForGeneratorsGoal`
    * `GetTotalGeneratorUnitsGoal`
    * `HitGeneratorUnitTargetsGoal`
* *FEATURE* Introduce a common base class (`UpgradeGoal`) for all goals that deal with `IUpgradeable`. The following goals have been refactored to work with the base class.
    * `GetUpgradesForCurrencyTypeGoal`
    * `UpgradeAnyCurrencyGoal`
* *FEATURE* Added new action `GoalActivatedAction` that gets send when an `IGoal` is newly activated in the `IStage`.
* *CHANGE* `HitGeneratorUnitTargetsGoal` now listens to `GeneratorUnitTargetHitStateAction` instead of `GeneratorUnitTargetHitAction`.
* *BUGFIX* `GetGeneratorUnitsForGeneratorTypeGoal` no longer incorrectly caches the first `Generator` in the stage, as it may be of the wrong type.
* *CHANGE*  The following goals now subscribe to `TradeActivatedAction` instead of `MakeExchangeAction`:
    * `MakeAnyTradeGoal`
    * `MakeTradeTypeGoal`
* *CHANGE* `Goal.normalizedProgress` and `GoalSavedData.normalizedProgress` now return a double instead of a float

### JsonSerializer
* *CHANGE* `JsonSerializer` has been renamed to `SimpleJsonSerializer`.

### Loading
* *FEATURE* Added `AsyncContext` to allow the application initialization process to take place over multiple frames.
* *FEATURE* Added `AsyncLoader` utility that can load a group of `IAsyncLoadable`s over multiple frames.

### Main
* *CHANGE* Refactored completely to use the new `IStartup` and `ILoadPhase` system.
* *REMOVE* `IStage` is now being loaded in `Content` it has been removed from `Main.cs`.
* *CHANGE* Moved `Main` to `idlekit-tools`.

### Milestone
* *REMOVE* `MilestoneData.rewardId` has been removed as it served no purpose. See `UPGRADENOTES.md` for details.
* *REMOVE* `MilestoneProgressAction` has been removed due to the introduction of `ProgressMilestoneStateAction` and `SetMilestoneProgressStateAction`.
* *FEATURE* Added `ProgressMilestoneStateAction` and `SetMilestoneProgressStateAction` as previously the `IMilestoneSavedData` is altered in the `IMilestone` which is against the IdleKit convention.
* *CHANGE* `MilestoneCompletedStateAction` has been renamed `CompleteMilestoneStateAction` for clarity.
* *CHANGE* `normalizedProgress` now returns a double instead of a float

### Modifier Cache
* *CHANGE* `IModifiers`, `IModifiables`, and `IModifierFormula` are now stored in hash sets.
* *CHANGE* `_specificModifierLookup`, `_globalModifierLookup`, `_specificModifiableLookup`, and `_globalModifiableLookup` have been consolidated into `_modifierLookup` and `_modifiableLookup`.
* *CHANGE* Methods have been updated to use the new lookup structure.
* *REMOVE* `GetModifier(string modifierId)` and `GetModifiable(string modifiableId)` have been removed.

### Modifier Service
* *CHANGE* This Service now listens to `EntityRemovedAction` to unregister `IModifiers` and `IModifiables`.
* *REMOVE* The `ModifierService` no longer loads all `IBoost` Entities in the Entities Database when the `Content` is loaded, see UPGRADENOTES.md for more details.
* *REMOVE* Removed all implementations of `IModifierCategoryData`:
    * `AscensionPowerModifierCategoryData`
    * `GeneratorPayoutModifierCategoryData`
    * `GeneratorSpeedModifierCategoryData`
    * `GeneratorUnitCostModifierCategoryData`
    * `ModifierCategoryDataAsset`
* *CHANGE* `ModifierData.modifierCategoryId` was renamed to `ModifierData.modifierGroupId`.
* *REMOVE* `ModifierData.modifierCategoryData`, `ModifierData.Initialize()` and `ModifierData.CompareTo()` have been removed.
* *FEATURE* Added `IModifierFormula` and `IModifierFormulaData` implementations to replace the old `ModifierCategoryData` implementations:
    * `AscensionPowerModifierFormula`
    * `AscensionPowerModifierFormulaData`
    * `AscensionPowerModifierFormulaDataAsset`
    * `GeneratorPayoutModifierFormula`
    * `GeneratorPayoutModifierFormulaData`
    * `GeneratorPayoutModifierFormulaDataAsset`
    * `GeneratorSpeedModifierFormula`
    * `GeneratorSpeedModifierFormulaData`
    * `GeneratorSpeedModifierFormulaDataAsset`
    * `GeneratorUnitCostModifierFormula`
    * `GeneratorUnitCostModifierFormulaData`
    * `GeneratorUnitCostModifierFormulaDataAsset`
    * `ModifierFormula`
    * `ModifierFormulaData`
    * `ModifierFormulaDataAsset`
* *FEATURE* Added `ModifierFormulaParser` to parse human readable formulas that now drive the `Modifier` system.
* *CHANGE* Renamed `ModifierCategoryData` and `ModifierCategoryDataAsset` to `ModifierGroupData` and `ModifierGroupDataAsset`.
* *CHANGE* All methods in `EconomyService`, `ModifierService` and `ModifierCache` that used `ModifierCategoryData` types to filter results now use `ModifierFormula` types instead.
* *CHANGE* Implemented additional `IModifierService` and `IModifierCache` methods.
* *CHANGE* `ModifierService` now pipes all modifier logic through `ModifierFormula` objects instead of handling the logic internally.

### Namespaces
* *CHANGE* The following namespaces have been changed:
    * `IdleKit` to `IdleKit.Implementation`
	* `IdleKit.PlotPoint` to `IdleKit.Implementation`

### Offline Activity Tracker
* *FEATURE* Once the offline catch-up process is complete, an `OfflineProgressEndAction` will be broadcast.

### PlotPoint
* *FEATURE* Added a number of new `ActivationCondition`s: `CurrencyObtained`, `CurrencyAvailable`, `NumTradesMade`, PlotPointSequenceEnded`.
* *CHANGE* Renamed `AscensionActivationCondition` to `AscensionCompleteActivationCondition`.
* *CHANGE* Improved logic for deciding whether a `PlotPointImageActor` can be reused or not.
* *CHANGE* The runtime implementation of the `PlotPointDataProvider` has been updated to utilize the `IContainer`.
* *REMOVE* Removed the concept of state machine from the `PlotPointController` as it was not a proper state machine
* *CHANGE* PlotPoint related `IAction`, and `IService`

### Reward
* *CHANGE* `TimerTrunk` and its related classes have been renamed to use the new suffix `TimedReward`.
* *CHANGE* Due to the refactor to `ITimedRewardSavedData`, the implementations of the `TimedReward`, `ClaimTimedRewardStateAction`, and `TimedRewardInitializationAction` have been altered to support the changes.
* *FEATURE* Added new `CurrencyUnlockReward` that sets the rewarded `Currency`s `ICurrencySavedData.available` to true.
* *CHANGE* Changed the name of `RandomTagsCurrencyReward` to `BaseRandomCurrencyReward` and removed all `allowUnobtained` logic from it.
* *FEATURE* Added new `RandomObtainedCurrencyReward` extending `BaseRandomCurrencyReward` that pulls a reward from `ICurrency`s that match the `ITagConsumerData` and are obtained. If it is unable to reward a currency it will fall back to a different reward if set.
* *FEATURE* Added new `RandomUnobtainedCurrencyReward` extending `BaseRandomCurrencyReward` that pulls a reward from `ICurrency`s that match the `ITagConsumerData` and are not yet obtained. If it is unable to reward a currency it will fall back to a different reward if set.
* *CHANGE* The `CurrencyRewardData` constructor will now throw an exception if invalid min/max values are passed.
* *CHANGE* Moved `AscensionRewardGroup` to `idlekit-framework` since an interface there references it.
* *CHANGE* The `CanClaim` methods of the following reward types have been updated to include an optional `ignoreFallback` flag:
    * `AscensionReward`
    * `CurrencyReward`
    * `CurrencyUnlockReward`
    * `GachaReward`
    * `TimedReward`
* *CHANGE* The `ICurrency` used by `CurrencyReward` is now assigned on initialization and cached.
* *CHANGE* `TimerTrunk.CanClaim` now implements an optional `ignoreFallback` flag.
* *CHANGE* `ShowcaseTimerTrunk` has been moved to `idlekit-implementation` and renamed `TimerTrunk`.

### Saved Data
* *FEATURE* Introduced `SerializedDataCache` to keep track of all the content specific `ISavedData` based on the `IContent.instanceId` they are associated with. This object is serialized by the default IdleKit implementation.
* *BUGFIX* Fixed the bug where content specific `ICurrency` is being saved as a global `ICurrency`, which means the progress is not specific to the `IContent`(event).

### Serialization Service
* *CHANGE* Due to the refactor to store the last activity time using `IUserSavedData.SetLastActivityTime(long)`, the `SerializationService` does not need to subscribe to `ContentInitializedAction` and `ClearContentStateAction`.
* *CHANGE* `SerializationService` is now responsible for maintaining the `SerializedDataCache`. This enables the tracking and deleting of content specific `ISavedData` of a different `IContent`.
* *CHANGE* Introduced `SerializationService.GenerateContentSpecificSavedId(string savedId)`, which consolidates all content specific `savedId` generation logic.

### Services
* *CHANGE* All `IServices` no longer contain cached lookups. They have been converted to retrieve the `IEntity` using the `IResolver` or `IEntityResolver`.
* *CHANGE* Renamed the following Services to better fit naming conventions.
    * `CurrencyManager` was renamed to `CurrencyService`
    * `Economy` was renamed to `EconomyService`
    * `EntityLoader` was renamed to `EntityLoaderService`
    * `EventManager` was renamed to `ActionService`
    * `EventContentManager` was renamed to `EventService`
    * `ModifierManager` was renamed to `ModifierService`
    * `PlotpointManager` was renamed to `PlotpointService`
    * `RewardManager` was renamed to `RewardService`
    * `StaticDataLoader` was renamed to `DataLoaderService`

### Startup
* *FEATURE* Added abstract `Startup` class that handles typical IdleKit load and content/stage switching load sequences.
* *FEATURE* Added abstract `PhaseLoader` class that manages loading sequences of `ILoadPhase` objects. `Startup` currently extends this class.
* *FEATURE* Added implementations for all specific `ILoadPhase` interfaces defined in `idlekit-framework`:
    * `InjectDependenciesLoadPhase`
    * `InitializeUserLoadPhase`
    * `LoadGlobalDataLoadPhase`
    * `ProcessEventsSavedDataLoadPhase`
    * `LoadContentDataLoadPhase`
    * `LoadContentLoadPhase`
    * `ClearContentLoadPhase`

### Static Data
* *CHANGE* `DataLoaderService` is now able to load global data that do not get cleared between `IContent`.
* *CHANGE* A `StaticDataRemovedAction` is now sent when data is removed from the `DataLoaderService`.

### Trade
* *CHANGE* `MakeTrade()` now returns a `bool` depending on whether or not the Trade was successful.
* *FEATURE* The input and output currency amounts for an `ITrade` can now be set via `SetInputCurrencyAmount(CurrencyAmount currencyAmount)` and `SetOutputCurrencyAmount(CurrencyAmount currencyAmount)`.

### Timer Subscription
* CHANGE* The overloaded constructor for `TimerSubscription` no longer accepts a `DateTime` endTime without an initial timestamp.

### Timer Trunk
* *CHANGE* The `TimerTrunk` implementation has been renamed to `TimedReward`. Related `IAction`s and `IStateAction`s have been renamed accordingly. See `UPGRADENOTES.md` for more information.
* *CHANGE* Subscription to the `TimerService` is now made before, rather than after, the `TimedRewardStartAction` is sent.

### Unity
* *CHANGE* Upgraded Unity support to 2018.4.18f1.

### idlekit-tools

### Asset Importer
* *CHANGE* `ShowcaseDataAssetImporter` has been moved into `idlekit-tools` and merged with `BaseDataAssetImporter`.
* *CHANGE* `BaseDataAssetImporter` has been renamed `SimpleDataAssetImporter`. Related classes such as `BaseDataAssetImporterEditorWindow` and `DataAssetImporterLogger` have also been prefixed with `Simple`.
* *CHANGE* `BaseEntitiesDatabaseHelper` has been renamed `SimpleEntitiesDatabaseHelper`
* *CHANGE* The following `DataAssetHeaders` and `DataAssetCreators` have been moved from `idlekit-showcase` into `idlekit-tools` and renamed:
    * `ShowcaseContentDataAssetHeader` to `StandardContentDataAssetHeader`
	* `ShowcaseEventContentDataAssetHeader` to `StandardEventContentDataAssetHeader`
	* `ShowcaseTimerTrunkDataAssetHeader` to `TimerTrunkDataAssetHeader`
	* `ShowcaseContentDataAssetCreator` to `StandardContentDataAssetCreator`
	* `ShowcaseEventContentDataAssetCreator` to `StandardEventContentDataAssetCreator`
	* `ShowcaseTimerTrunkDataAssetCreator` to `TimerTrunkDataAssetCreator`
* *CHANGE* The Data Asset Creators for `StandardEventContent` and `StandardContent` have been updated to import the `videoAdBoostId` field.
* *FEATURE* Added `TimedBoostDataAssetCreator` and `BoostDataAssetCreator` to allow for importing of Boosts and TimedBoosts

### Continuous Integration
* *FEATURE* Added a continuous integration script under `Builder/Jenkinsfile` that serves as an example on how to setup a Jenkins Multi-branch Pipeline with IdleKit.

### Debug Tools
* *CHANGE* All debug tools that were initalized on `ContentInitializedAction` now listen to `IdleKitInitializedAction` instead.
* *CHANGE* `DebugCurrencyTool` UI is able to take in negative number now, which is helpful for completing negative-income goals like `SpendCurrencyGoal`.
* *CHANGE* The `DebugAscendStageTool` and `DebugRewardTool` now both use the newly implemented `DebugGrantRewardStateAction` in order to grant rewards.

### Dependency Container
* *FEATURE* Added `SimpleInstaller` to handle `PlotPoint` related `IActions` and `IServices` dependency registrations.

### Entity Loader
* *CHANGE* Added unit test to test the `IEntity` reference tracking ability introduced to `EntityLoader`.

### Namespaces
* *CHANGE* The following namespaces have changed:
	* `IdleKit.Tools.Editor.GuidReference` to `IdleKit.Tools.Editor`
	* `IdleKit.Tools.Editor.PlotPoint` to `IdleKit.Tools.Editor`
	* `IdleKit.Tools.Editor.DataAssetImporter` to `IdleKit.Tools.Editor`
	* `IdleKit.Tools.Common` to `IdleKit.Tools`
	* `IdleKit.Tools.Test` to `IdleKit.Tools.Tests`

### Number Formatter
* *CHANGE* `FormatDouble` will now also round values of less than 1000 as specified via the `roundDown` argument. See UPGRADENOTES.md for details.

### Plot Points
* *BUGFIX* The inspector updating of `GameObject` data for `PlotPointActor` types that was previously directly invoked from `PlotPointBaseActor.OnValidate` is now called in `LateUpdate` to resolve Unity warnings.
* *CHANGE* Updated all prefabs to nested prefabs after migration to 2018 LTS.
* *FEATURE* Added `MilestoneCompletedActivationCondition`.

### Prefabs
* *CHANGE* Added Prefab Unity scene that is now used by nested prefabs.
* *CHANGE* Updated all UI prefabs to nested prefabs after migration to 2018 LTS.

### Static Data
* *FEATURE* Added unit test for `IStaticDataLoader` due to the addition of global `IStaticData` loading.

### Startup
* *CHANGE* Moved `Main` from `idlekit-implementation`. Main now extends `Startup`.
* *CHANGE* Adjusted `CanvasMain` to work with startup flow changes. The static links to PlotPoint specific components have been moved into `SimpleStartup`.
* *REMOVE* Removed `PlotPointMain` and moved it's functionality into `SimpleInstaller`, `SimpleStartup`, and `LoadPlotPointsDataLoadPhase`.
* *FEATURE* Added UI specific load phases:
    * `CanvasInitializeLoadingViewLoadPhase`
    * `CanvasInitializeUILoadPhase`
    * `CanvasCleanupUILoadPhase`
    * `CanvasToggleDebugUILoadPhase`
* *FEATURE* Added PlotPoint specific load phases:
    * `LoadPlotPointsDataLoadPhase`

### UI
* *FEATURE* Introduced `CanvasEntityView<TEntity>` that serves as the base class and handle the dependency for all `CanvasView` that showcases a single `IEntity`.
* *CHANGE* Moved all UI specific code out of `Context` and into `CanvasContext`.
* *CHANGE* All `CanvasView` are now being properly injected on creation or own startup.
* *CHANGE* `CanvasUI` now displays a `CanvasGenericDialog` when a `TimerTrunk` is claimed.
* *CHANGE* All `IAction` related code has been moved into `CanvasUI` from `ShowcaseCanvasUI`.
* *CHANGE* Consolidated all the `CanvasEntityView` creation, initialization and cleanup code into `CreateEntityViews` and `CleanupEntityViews` methods on `CanvasEntityPanel`. All the codes related to populating and cleaning up owning `CanvasEntityView` have been refactored to use this method. (e.g: `CanvasStageView` now calls `CanvasGeneratorPanel.CreateEntityViews` to populate the generator views.)
* *CHANGE* `CanvasContentView` is now responsible for populating `CanvasStageView`, `CanvasEventView`, `CanvasMilestoneView`, `CanvasReturnToMainContentView`, `CanvasTradeViews`, and `CanvasTimedRewardViews`. It is the point of entry for recursively creating all the `CanvasEntityViews` in the UI. The following classes have been changed due to the implementation:
    * `CanvasMain`
    * `CanvasUI`
    * `CanvasContentView`
    * `CanvasStageView`
* *CHANGE* Introduced `CanvasModifierEntityView` so `CanvasBoostView`and `CanvasUpgradeableCurrencyView` can share code that displays the `ModifierData` information in a popup `CanvasDialog`.
* *CHANGE* `CanvasTimedBoostView` has been implemented, extracting the `TimedBoost` specific functionality from `CanvasBoostView`.
* *CHANGE* `CanvasBoostView` no longer listens for `ToggleBoostStateAction` to activate itself. Instead the view is always active so that Boosts which are not currently active are still displayed, and can be activated by, the UI.
* *REMOVE* `CanvasModifierDataView` and its UI prefab have been removed as the information is now shown in a `CanvasDialog` popup.
* *CHANGE* `CanvasUI` now listens to `GeneratorUnitTargetHitStateAction` instead of `IncrementGeneratorUnitStateAction` to show Generator unit target rewards.
* *CHANGE* Added `CanvasContentView canvasContentView { get; }` to `CanvasUI`. This is used by the new `CanvasInitializeUILoadPhase`.
* *FEATURE* Added `CanvasLoadingView` that tracks load progress that is dispatched from `IStartup`.
* *CHANGE* Moved `CanvasDebugToggle` from `idlekit-showcase` to here.
* *CHANGE* Refactored `CanvasMain` to work with the new `IStartup` load flow.
* *CHANGE* Any display of double values are now rounded consistently. All payouts and amounts the player has are now floor, targets and costs are ceiling.
* *CHANGE* `CanvasMilestoneView` now displays rewardId based on data in the `IEventSettings`.
* *BUGFIX* Fix a bug where `CanvasTradeViews` are not being cleared up between `IContent` so `Trades` in a different `IContent` are causing null references.
* *BUGFIX* Fix a bug where `CanvasUpgradeableCurrencyViews` display the wrong background colours when the `IUpgradeableCurrencies` are made available on `IStage` start.
* *CHANGE* A number of `CanvasView` classes have moved from `idlekit-showcase` into `idlekit-tools`:
    * `CanvasAscensionGameplay`
	* `CanvasMissingResourcesDialog`
	* `CanvasTimerTrunkView`
* *CHANGE* `PlotPointUI` has been renamed `StandardUI`. See `UPGRADENOTES` for more.
* *FEATURE* Added a `CanvasModifiableEntityView` which is the equivalent of the `CanvasModifierEntityView` but displays information about all `IModifiers` that affect the `IModifiable`.

### Unity
* *CHANGE* Upgraded Unity support to 2018.4.18f1.
* *CHANGE* All the IdleKit UI has been retrofitted to work with Unity's nested prefabs system. The prefabs components that built up all the nested prefabs are located in `idlekit-tools/Common/Prefabs`.

### Test
* *FEATURE* Due to the introduction of `IEntity.Initialize()` and the changes made to `IEntity.Cleanup(IEntityLoader)` all `IEntity` unit tests also now test `Initialize()` and `Cleanup(IEntityLoader)` methods for all `IEntity`.

### Welcome Back Dialog
* *BUGFIX* Now only unsubscribes from `CollectFromGeneratorStateAction` when the `OfflineProgressEndAction` is recieved. This resolves an issue where currency earned via collections after `TimedBoost` expiry were not being displayed correctly.

### idlekit-examples
### Continuous Integration
* *FEATURE* Added a continuous integration script under `Builder/Jenkinsfile` that serves as an example on how to setup a Jenkins Multi-branch Pipeline with IdleKit.

### Examples
* *CHANGE* The Boost Example now shows how both `IBoost` and `ITimedBoost` Entities function.
* *CHANGE* The `LoopingContentSavedData` implementation no longer overrides `currentStageId` as it is required by the `LoadPlotPointDataLoadPhase`.
* *REMOVE* Removed the `ContentSwitch` example as it wasn't demonstrating useful functionality.

### Loading
* FEATURE* Added new "AsyncLoading" and "SynchronousLoading" examples to demonstrate the two approaches to loading.

### PlotPoint
* *CHANGE* The previous `PlotPoint` tutorial example has been moved into `(REPO)/Runtime/Tutorials/PlotPoint`
* *FEATURE* Add a new `PlotPoint` example that has built in plotpoints for all the `IPlotPointActivationCondition` offered in IdleKit.

### Prefabs
* *CHANGE* Updated all UI prefabs to nested prefabs after migration to 2018 LTS.
* *CHANGE* All prefabs previously in `idlekit-showcase` have been moved into `idlekit-tools`.

### UI
* *CHANGE* Due to the update to `CanvasContentView`, the following classes have been modified or removed (replaced with their parent classes in Unity):
    * `BoostMain` - modified
    * `BoostUI` - removed
    * `ContentSwitchUI` - removed
    * `CurrencyUI` - removed
    * `GachaUI` - removed
    * `SynchronousLoadingContext` - removed
    * `TimedRewardMain` - modified
    * `TimedRewardUI` - removed
    * `TradeMain` - removed
    * `TradeUI` - removed

### Unity
* *CHANGE* Upgraded Unity support to 2018.4.18f1.
* *CHANGE* The examples scenes are now composed of nested prefabs (with variants) built from the prefab components located in `idlekit-tools`.

### idlekit-showcase
### General
* *CHANGE* All `idlekit-showcase` classes have been moved into `idlekit-framework`, `idlekit-implementation`, and `idlekit-tools`.

### Asset Importer
* *CHANGE* All asset importers and headers in `idlekit-showcase` have been moved into `idlekit-tools`.

### CanvasView
* *CHANGE* The following `CanvasViews` have been moved to `idlekit-tools`:
    * `CanvasAscensionGameplay`
	* `CanvasMissingResourcesDialog`
	* `CanvasTimerTrunkView`
* *REMOVE* `CanvasShowcaseUpgradeableCurrencyView` has been merged with `CanvasUpgradeableCurrencyView` and it's cs file removed.

### Content
* *CHANGE* The previous `idlekit-showcase` content entities have been renamed and moved into `idlekit-implementation`.
    * `IShowcaseContent`, `ShowcaseContent` and related classes to `IStandardContent` and `StandardContent`
	* `IShowcaseEventContent`, `ShowcaseEventContent` and related classes to `IStandardEventContent` and `StandardEventContent`

### Continuous Integration
* *FEATURE* Added continuous integration scripts under `Builder/` folder that serve as examples on how to setup a Jenkins Multi-branch Pipelines with IdleKit.

### Services
* *CHANGE* `ShowcaseUpgradeableCurrencyManager` was renamed `StandardCurrencyService` and move into `idlekit-implementation`.

### Settings
* *CHANGE* Added the editor settings file to Showcase project as it contains nested prefab editing environment settings.
* *CHANGE* Added the project version file to the Showcase project as it contains Unity version information.
* *CHANGE* Added the Unity manifest file to the Showcase project as it contains dependency information.

### UI
* *CHANGE* Due to the update to `CanvasContentView`, the following classes have been modified or removed:
    * `ShowcaseUI` - removed, replaced the usage with its base `StandardUI` and `CanvasUI`.
    * `ShowcaseContentView` - modified, moved into `idlekit-tools` and renamed to `StandardCanvasContentView`
* *CHANGE* Moved `CanvasDebugToggle` to `idlekit-tools`.
* *CHANGE* Any display of double values are now rounded consistently. All payouts and amounts the player has are now floor, targets and costs are ceiling.

### Unity
* *CHANGE* Upgraded Unity support to 2018.4.18f1.
* *CHANGE* The `Showcase` scene is now composed of nested prefabs (with variants) built from the prefab components located in `idlekit-tools`.

### UpgradeableCurrency
* *REMOVE* `ShowcaseUpgradeableCurrency` has been removed. See `UPGRADENOTES` for detail.
* *REMOVE* `ShowcaseUpgradeableCurrencyManager` has been removed. See `UPGRADENOTES` for detail.

### TimerTrunk
* *CHANGE* The `IShowcaseTimerTrunk` interface and `ShowcaseTimerTrunk` implementation has been moved to `idlekit-framework`\`idlekit-implementation` and renamed `ITimerTrunk` and `TimerTrunk`.

## Version 0.20.7, 2020-01-28
### idlekit-framework
* N/A

### idlekit-examples
* N/A

### idlekit-implementation
* *BUGFIX* `Stage.Cleanup()` now correctly calls `Cleanup()` on each active goal rather than `Deactivate()`, which would previously cause the goal progress to reset on content switch.
* *BUGFIX* The `Milestone` tracking code in `OfflineActivityTracker` now fails gracefully when completion times overflow.

### idlekit-showcase
* N/A

### idlekit-tools

### Plot Points
* *FEATURE* Added `MilestoneCompletedActivationCondition`.

## Version 0.20.6, 2019-12-11
### idlekit-framework
* N/A

### idlekit-examples
* N/A

### idlekit-implementation

### Event Settings
* *BUGFIX* `EventSettingsSavedData` now correctly serializes the next `IMilestone` completion time.
* *BUGFIX* `EventSettings` now subscribes to the `ITimerService` after a `ContentInitializedEvent` is triggered. This prevents the `ITimerService` from evaluating any `IEventSettings` that are subscribed to it before the initialization phase has completed. It was previously possible for an `EventEndedEvent` to be triggered before all the `IEntities` were loaded.

### idlekit-showcase
* N/A

### idlekit-tools
* N/A

## Version 0.20.5, 2019-11-20
### idlekit-framework

### Economy
* *CHANGE* Added optional `IModifier[]` exclusion list parameter to several methods in `IEconomy`.
  * `GetPayout(IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)`
  * `GetDuration(IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)`
  * `GetAffordableUnitsToNextTarget(IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null);`
  * `GetMaxAffordableUnits(IGeneratorEntity generatorEntity, bool applyModifiers, int maxCap = -1, IModifier[] excludedModifiers = null)`
  * `GetIncrementGeneratorUnitCost(int unitsToIncrease, IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)`
  * `GetAscensionPower(IStage stage, bool applyModifiers = true, double ascensionPower = 1d, IModifier[] excludedModifiers = null)`

### Event Settings
* *CHANGE* Moved time related functionality from `idlekit-showcase`. Doing this allows for the prediction of milestone completion times for use when events are finished while players are offline.
  * Added `IEventSettings.isActive`
  * Added `IEventSettings.SetMilestoneCompletionTime(string milestoneId, long timestampInMilliseconds)`
  * Added `IEventSettings.StartEvent(long timestampInMilliseconds)`
  * Added `IEventSettings.EndEvent(long timestampInMilliseconds)`
  * Added `IEventSettingsData.eventDurationInMilliseconds { get; }`
  * Deprecated `IEventSettingsSavedData.completedMilestoneIds { get; }`. See `UPGRADENOTES` for details.
  * Added `IEventSettingsSavedData.milestoneCompletionInfo { get; }`
  * Added `IEventSettingsSavedData.timeStartedInMilliseconds { get; }`
  * Added `IEventSettingsSavedData.timeCompletedInMilliseconds { get; }`
  * Added `IEventSettingsSavedData.isComplete { get; }`
  * Deprecated `IEventSettingsSavedData.CompleteMilestone(string milestoneId)`. See `UPGRADENOTES` for details.
  * Added `IEventSettingsSavedData.CompleteMilestone(string milestoneId, long timestampInMilliseconds)`
  * Added `IEventSettingsSavedData.StartEvent(long eventStartTimeInMilliseconds)`
  * Added `IEventSettingsSavedData.EndEvent(long eventEndTimeInMilliseconds)`

### Modifier Cache
* *CHANGE* Added optional `IModifier[]` exclusion list parameter to `IModifierCache.SearchModifiersAffectingModifiable<TModifierCategoryData>(string modifiableId, bool checkCanBeApplied = true, IModifier[] excludedModifiers = null)`.

### Modifier Manager
* *CHANGE* Changed `IModifierManager` and `IModifierCache` method signatures that involve applying modifiers to take an optional list of `IModifier` objects to exclude from calculations.
  * `IModifierManager.ApplyModifiers<TModifierCategoryData>(IModifiable modifiable, ref double modifiedValue, IModifier[] excludedModifiers = null)`
  * `IModifierManager.ApplyModifiers<TModifierCategoryData>(IModifiable modifiable, ref double modifiedValue, int additionalLevels, IModifier[] excludedModifiers = null)`

### Timer Service
* *CHANGE* Added `ITimerService.timestampInMilliseconds`.

### idlekit-implementation

### Economy
* *CHANGE* `Economy` implemented all changes made in `IEconomy`.

### Event Settings
* *CHANGE* `EventSettings` implemented all added interface properties and methods in `IEventSettings.`
* *CHANGE* `EventSettings` implemented `ITimerListener` and based on the Event duration will automatically end the event after the duration has passed.
* *FEATURE* Added `EventStartedEvent` and `EventEndedEvent` events that are dispatched by `EventSettings` when an event starts or ends.
* *CHANGE* `EventSettings.CanClaimRewards(string contentId)` now also checks that the Event is complete.
* *CHANGE* `EventSettings.GetRewardIds()` now checks milestone completion times before adding rewards to the list.
* *CHANGE* Added serialized date `EventSettingsData._eventDurationInSeconds` which is converted to milliseconds at runtime and accessible via `EventSettingsData.eventDurationInMilliseconds`.
* *CHANGE* `EventSettingsSavedData` implemented all changes made in `IEventSettingsSavedData`.
* *FEATURE* Added `IdleKitInitialized` event to signify when all IdleKit Entities have been initialized.

### Main
* *CHANGE* Now broadcasts the `IdleKitInitialized` at the end of `Main.StartGame`.

### Modifier Cache
* *CHANGE* Updated `IModifierCache` to optionally allow a list of `IModifier` objects to exclude when `ApplyModifiers()` is called.

### Modifier Manager
* *CHANGE* Updated `ModifierManager` to optionally allow a list of `IModifier` objects to exclude when `ApplyModifiers()` is called.

### Offline Activity Tracker
* *FEATURE* Added logic that will calculate future `Milestone` completion times periodically, moves between content and when a player backgrounds the app. These times are then used when calculating which milestones were completed after an event has been finished and rewards are being claimed. This will allow a user to leave an event content and not return to it while the event is active, yet still claim all of the milestones they completed while being away from the app.
* *CHANGE* Now listens to `IdleKitInitialized` event rather than `StageInitializedEvent` to perform catch-up logic. This ensures that all Entities have been initialized prior to the catch-up.

### Timer Service
* *CHANGE* Added `TimerService.timestampInMilliseconds`.

### idlekit-tools

### UI
* *REMOVE* Moved all event related UI code from `idlekit-showcase` and deleted original class.
  * `ShowcaseCanvasEventView.cs` to `CanvasEventView`
  * `ShowcaseCanvasReturnToMainContentView.cs` to `CanvasReturnToMainContentView`
  * `ShowcaseCanvasStageView.cs` to `CanvasStageView`

### idlekit-examples

* N/A

### idlekit-showcase

### Events
* *REMOVE* Removed `ShowcaseEventStartedEvent` and `ShowcaseEventEndedEvent`.

### Event Settings
* *REMOVE* Removed all classes that extended `EventSettings` and related classes.
  * `IShowcaseEventSettings.cs`
  * `IShowcaseEventSettingsData.cs`
  * `IShowcaseEventSettingsSavedData.cs`
  * `IShowcaseEventSettingsDataAsset.cs`
  * `ShowcaseEventSettings.cs`
  * `ShowcaseEventSettingsData.cs`
  * `ShowcaseEventSettingsSavedData.cs`
  * `ShowcaseEventSettingsDataAsset.cs`
  * `ShowcaseEventSettingsDataAssetHeader.cs`
  * `ShowcaseEventSettingsDataAssetCreator.cs`

### UI
* *REMOVE* Removed Event related canvas extensions.
  * `ShowcaseCanvasEventView.cs`
  * `ShowcaseCanvasReturnToMainContentView.cs`
  * `ShowcaseCanvasStageView.cs`
* *CHANGE* Updated `ShowcaseUI` to work without the removed classes.

## Version 0.20.4, 2019-11-04
### idlekit-framework

* N/A

### idlekit-implementation

### Content
* *BUGFIX* Fix a bug that `IContentSavedData.currentStageId` is not being serialized until the first ascension.

### Event Content
* *BUGFIX* The next `Milestone` is no longer initialized with the previous `Milestone`'s progress if they are not tracking the same `currencyId`.

### Events
* *FEATURE* Introduce `OfflineProgressEndEvent` to mark that the Offline Activity Tracker catch-up process is complete.

### Goal
* *BUGFIX* `GetGeneratorUnitsForGeneratorTypeGoal` no longer incorrectly caches the first `Generator` in the stage, as it may be of the wrong type.
* *BUGFIX* `GoalData.isContentSpecific` is now set to true by default. See UPGRADENOTES.md for more detail.

### Offline Activity Tracker
* *FEATURE* Once the offline catch-up process is complete, an `OfflineProgressEndEvent` will be broadcast.

### idlekit-tools

### Welcome Back Dialog
* *BUGFIX* Now only unsubscribes from `CollectFromGeneratorPlayerEvent` when the `OfflineProgressEndEvent` is recieved. This resolves an issue where currency earned via collections after `TimedBoost` expiry were not being displayed correctly.

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

## Version 0.20.3, 2019-09-16
### idlekit-framework

### Milestones

* *BUGFIX* The `GuidReferenceable` attribute used with `MilestoneRewardPair._milestoneId` and `MilestoneRewardPair._rewardId` have been changed to `GuidReference`.

### idlekit-implementation

### Logger
* *BUGFIX* The `DebugLogger` now correctly copes with formatting of filepaths that are outside of the Unity project.

### Upgradeable Currency
* *BUGFIX* When a `UpgradeableCurrency` is obtained, a `ModifierIndexChangedEvent` will now be fired to denote that the modifier is active and will effect any related `IModifiable`.

### idlekit-tools

* N/A

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

## Version 0.20.2, 2019-09-03
### idlekit-framework

### Generator
* *BUGFIX* Introduced `GeneratorEntity.payoutCurrencyPerMilliSecond` as a replacement for `payoutCurrencyPerSecond`. See UPGRADENOTES.md for more details.

### idlekit-implementation

### Debug Logger
* *BUGFIX* Removed an erroneous using statement which could result in compile errors.

### Generator
* *BUGFIX* Introduced `GeneratorEntity.payoutCurrencyPerMilliSecond` as a replacement for `payoutCurrencyPerSecond` which was actually returning values in milliseconds. See UPGRADENOTES.md for more details.

### ToggleTimedBoostPlayerEvent
* *BUGFIX* Resolved an issue where the `ToggleTimedBoostPlayerEvent` would cache the first `TimedBoost` it was passed, see UPGRADENOTES.md for more details.

### idlekit-tools

### Asset Importer
* *BUGFIX* Fixed a number of issues to allow the MakeAnyTradeGoal and MakeTradeTypeGoal assets to be correctly generated and included in the Entities Database.

### Canvas View
* *CHANGE* The `CanvasBoostView` has been updated to account for changes to the `ToggleTimedBoostPlayerEvent`.

### Debug Tools
* *CHANGE* The `CanvasDebugTimeSkipTool` has been updated to work with `Generator.payoutCurrencyPerMilliSecond`.

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

## Version 0.20.1, 2019-07-18

### idlekit-framework

* N/A

### idlekit-implementation
### Saved Data
* *BUGFIX* Fixed the bug where content specific `ICurrency` is being saved as a global `ICurrency`, which means the progress is not specific to the `IContent`(event).

### idlekit-tools

* N/A

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

## Version 0.20.0, 2019-07-08
### idlekit-framework

### Content
* *CHANGE* The ascension flow has been revamped to enable an optional gameplay segment during the ascension. See the `UPGRADENOTES.md` or `docs.idlekit.io` for more details.

### Currency
* *REMOVE* `ICurrency.ContainsTag(string)` and `ICurrency.ContainsTagIn(string[])` have been moved to the newly created `ITagService`. See `UPGRADENOTES.md` for details.
* *CHANGE* `ICurrency` and `ICurrencyData` now implement `ITaggedEntity` and `ITaggedEntityData`.

### Currency Management
* *REMOVE* `GetAllCurrenciesOfTagOrRarity` has deprecated. See `UPGRADENOTES.md` for details.

### Gacha
* *CHANGE* Introduced `IGachaSlot` and `IGachaItem` interfaces to replace the previous `GachaSlot` and `GachaItem` struct. To keep concrete implementation in `idlekit-implementation`.

### Event Content
* *FEATURE* Introduced Event Contents with Milestone progress support to IdleKit. This will allow for alternate Content that tracks player progress via Milestones with rewards. See UPGRADENOTES.md for details.

### Modifiers
* *CHANGE* Refactored the `ModifierCache` to work more like the `IEntityCache`. Now an `IModifierCache` exists and is integrated into the dependency binding system. This allows for much more extensibility and the implementation of custom `IModifierCache` objects.
* *CHANGE* Added `IModifierCategoryData.targetModifiableTypes` to allow `IModifierCache` to organize and return `IModifiable` objects and provide verification that given `IModifierCategoryData` filters only `IModifiable` objects that can actually be affected by that `IModifierCategoryData`.
* *CHANGE* Added `IModifier.modifierId` to provide a single identifier to use when retrieving `IModifier` objects.
* *CHANGE* Added `checkCanBeApplied` parameter to `IModifierCache.SearchModifiersAffectingModifiable<TModifierCategoryData>(string modifiableId, bool checkCanBeApplied = true)` that defaults to `true`. This will maintain previous behaviour, but allow searches for `IModifier` objects that can't be applied yet.
* *CHANGE* Added `IModifierManager.GetModifiable()`, `IModifierManager.GetAllModifiablesOfType<T>()`, `IModifierManager.GetModifiablesAffectedByModifier(string modifierId)` and `IModifierManager.GetModifiablesAffectedByModifier<TModifierCategoryData>(string modifierId)` to make `IModifierManager` provide more data access.
* *CHANGE* Moved `ModifierSearchResult` from `idlekit-implementation` to it's own class file in `idlekit-framework`

### Plot Points
* *FEATURE* Added `IPlotpointController.canPlay { get; }`. This can be used to help manage PlotPoint playback.

### Saved Data
* *FEATURE* Added `long timeCreated` and `long timeModified` to all `ISavedData` and its override. We are now able to track the time the `ISavedData` was created and last modified. All classes that implement `ISavedData` have had their constructor changed. See `UPGRADENOTES.md` for details.

### Static Data
* *CHANGE* Due to the `ISavedData` refactor all classes that implement `ISavedDataProvider` have had their signatures changed. See `UPGRADENOTES.md` for details.

### Tag

### Tagged
* *FEATURE* Introduced `ITaggedEntity`, and `ITaggedEntityData` for the Entity classes that contain `ITagData[]`. `ITagConsumerData` has also been added as a utility interface for Entities that target multiple `ITaggedEntity`.

### Tag Consumer Data
* *FEATURE* `ITagConsumerData` which contains an array of `targetTagIds` and a `targetAll` flag to represent whether the Entity targeting these tags requires all or any of them to be present on the target `ITaggedEntity`.

### Tag Service
* *FEATURE* Introduced `ITagService` and its implementation `TagService` that deal with all `ITagData` related logic between the `ITaggedEntity` and `ITagConsumerData`.

### Trade
* *FEATURE* `ITrade` interface has been added to allow for Trade to become a full Entity with a Controller class.
* *FEATURE* `ITradeService` interface has been added to allow for creation of a Trade Service to manage `ITrade` Entities.
* *CHANGE* `ITradeData` now inherits from `IEntityData`. See `UPGRADENOTES.md` for more details.
* *CHANGE* `ICurrencyManager.GetAllCurrenciesOfTagOrRarity` has been deprecated. See `UPGRADENOTES.md` for more details.

### idlekit-implementation

### Currency Manager
* *CHANGE* The arguments for the `CurrencyManager` constructor now require `ITagService`.

### Event Content
* *FEATURE* Added implementations for all aspects of the new Event Content feature.

### Events
* *FEATURE* Added `AscensionStartEvent` that signals the start of the ascension gameplay has been triggered by the player.
* *FEATURE* Added `long timeOffline { get; set;}` to `OfflineProgressEvent` to keep track of the time that the user is offline for.
* *CHANGE* `AscendPlayerEvent` has been renamed to `AscensionCompletePlayerEvent`. See `UPGRADENOTES.md` for details.
* *CHANGE* `AscensionCompleteEvent` has been renamed to `AdvanceStageEvent`. See `UPGRADENOTES.md` for details.

### Generators
* *CHANGE* Internal logic uses milliseconds. Data imports seconds and converts to milliseconds when read.
* *CHANGE* `GeneratorSavedEntityData` has gone through massive change due to the `ISavedData` refactor and code cleanup. See `UPGRADENOTES.md` for details.

### Goals
* *Feature* The following new Goals have been added for use with `ITrade` entities:
  * `MakeAnyTradeGoal` - satisfied when a certain number of Trades have been made by the player (not specific to the Trade Id).
  * `MakeTradeTypeGoal` - satisfied when a certain number of the specified Trades have been made.
* *CHANGE* Internal logic for dynamic goals uses milliseconds. Data imports seconds and converts to milliseconds when read.
* *CHANGE* Due to the introduction of `ITagConsumerEntity` and `ITagConsumerEntityData` the following `IGoal` and `IGoalData` have been refactored to implement the new interfaces:
    * `CollectCurrenciesWithTagsGoal`
    * `DynamicCollectCurrenciesWithTagsGoal`
    * `SpendCurrenciesWithTagsGoal`
    * `UpgradeCurrenciesWithTagsGoal`.

### Modifiers

* *CHANGE* Refactored `ModifierManager` so it is no longer a partial class. It now behaves like the other `IService` objects and can be extended in the same manner.
* *FEATURE* Moved `ModifierCache` out of `ModifierManager` and into it's own class that implements `IModifierCache`. This allows it to be full extensible since it is now included in the dependency system.
* *BUGFIX* Fixed issue where `ModifierCache.GetModifiersAffectingModifiable` methods would not return any `IModifier` objects that affected the `IModifiable` via `IModifierData.affectAll`.
* *CHANGE* Added `checkCanBeApplied` parameter to `ModifierCache.SearchModifiersAffectingModifiable<TModifierCategoryData>(string modifiableId, bool checkCanBeApplied = true)` to allow for optionally getting `IModifier` objects that cannot currently apply their modification. Previous behaviour remains unchanged.
* *FEATURE* Added additional methods to `ModifierManager` and `ModifierCache` to allow for the retrieval of `IModifiable` objects affected by specific `IModifier` objects.
    * `Modifiermanager.GetModifiable<T>(string id)`
    * `Modifiermanager.GetAllModifiablesOfType<T>()`
    * `Modifiermanager.GetModifiablesAffectedByModifier(string modifierId)`
    * `Modifiermanager.GetModifiablesAffectedByModifier<TModifierCategoryData>(string modifierId)`
    * `ModifierCache.modifiables`
    * `ModifierCache.GetModifiable(string modifiableId)`
    * `ModifierCache.RegisterModifiable(IModifiable modifiable)`
    * `ModifierCache.UnregisterModifiable(IModifiable modifiable)`
    * `ModifierCache.GetModifiablesAffectedByModifier(string modifierId)`
    * `ModifierCache.GetModifiablesAffectedByModifier<TModifierCategoryData>(string modifierId)`

### Random Reward
* *CHANGE* `RandomTagCurrencyReward` and the corresponding file has been renamed to `RandomTagsCurrencyReward` as it supports multiple `tagsId`.
* *CHANGE* `RandomTagsCurrencyReward` and `RandomTagsCurrencyRewardData` now implement `ITagConsumerEntity` and `ITagConsumerEntityData`.

### Plot Points
* *CHANGE* All types of ActivationConditionData and ActionData now have public constructors.
* *FEATURE* Added the ability to disable and enable PlotPoint playback. This will be useful when working with UI and PlotPoint flow. This is done via the these new PlotPoint Events:
    * `PlotPointSetPlaybackAvailabilityEvent` allows PlotPoint playback to be enabled or disabled by setting the `PlotPointSetPlaybackAvailabilityEvent.canPlay` property.
    * `PlotPointPlaybackAvailabilityChangedEvent` is dispatched by the `PlotpointController` when playback is enabled or disabled. `PlotPointPlaybackAvailabilityChangedEvent.canPlay` will reflect the current status.

### Saved Data
* *FEATURE* Added `BaseSavedData` that most classes that implement `ISavedData` extend to deal with the new `ISavedData.timeCreated` and `ISavedData.timeModified` functionality.

### Tag
* *FEATURE* All implementation of `ITagConsumerData` have the field `bool targetAll` added so if we can specify we want to match `all` or `any` in the target `ITaggedEntity` (e.g: `ICurrency`). The following Entities are effected:
  * `CollectCurrenciesWithTagsGoalData`
  * `DynamicCollectCurrenciesWithTagsGoalData`
  * `SpendCurrenciesWithTagsGoalData`
  * `UpgradeCurrenciesWithTagsGoalData`
  * `RandomTagsCurrencyReward`
* *FEATURE* `TagException` and `TagNotFoundException` have been added.

### Trade
* *FEATURE* `Trade` Entity controller has been added, implementing `ITrade` and containing all encapsulated logic required by a trade.
* *FEATURE* `TradeException` and `TradeNotFoundException` have been added.
* *CHANGE* `TradeData` holds arrays for input and output Tag Ids. See `upgradenotes.md` for more detail.

### Plot Points
* *BUGFIX* Fixed an issue where the  `AutomationAvailableActivationCondition` and `GeneratorAvailableActivationCondition` would not fire if their conditions were achieved during `Stage` initialization.

### Time Management
* *BUGFIX* Fixed an issue where subscriptions to the `TimerService` made prior to the initial Unity update would receive an invalid timestamp.
* *CHANGE* All time related logic is now done with milliseconds.
* *CHANGE* All `TimerSubscription` constructors that took time in seconds have been deprecated:
  * `TimerSubscription(float durationSeconds, bool loop = false)`
  * `TimerSubscription(float durationSeconds, long initialTimestamp, bool loop = false)`

### Timed Rewards
* *CHANGE* Internal logic uses milliseconds. Data imports seconds and converts to milliseconds when read.

### Timer Service
* *BUGFIX* Zero duration looping subscriptions no longer result in divide by zero exceptions in `TimerService.EvaluateListeners`.
* *CHANGE* `TimerSubscription.duration` will now throw an exception if set to less than zero.

### Saved Data
* *FEATURE* Added `BaseSavedData` that most classes that implement `ISavedData` extend to deal with the new `ISavedData.timeCreated` and `ISavedData.timeModified` functionality.

### Upgradeable Currency
* *CHANGE* `bool UpgradeableCurrency.canBeApplied { get; }` no longer considers the availability of the `UpgradeableCurrency`.

### Upgradeable Currency Manager
* *CHANGE* The arguments for the `UpgradeableCurrencyManager` constructor now require `ITagService`.

### idlekit-tools

### Asset Importer
* *CHANGE* `TradeDataAssetCreator` now imports and fills out arrays for input and output currency tag Ids.
* *CHANGE* Due to the addition of `ITagConsumerData`, Asset Creators for the following Static Data have been updated:
  * `CollectCurrenciesWithTagsGoalData`
  * `DynamicCollectCurrenciesWithTagsGoalData`
  * `SpendCurrenciesWithTagsGoalData`
  * `UpgradeCurrenciesWithTagsGoalData`
  * `RandomTagsCurrencyReward`

### Goals
* *CHANGE* Due to the refactoring of all `ITagConsumerEntity` `IGoals`s, the corresponding unit tests have been updated.

### Modifier
* *CHANGE* `IModifier` related tests have been moved into `GeneratorTest`, `TimedBoostTest`, and `UpgradeableCurrencyTest`.
* *REMOVE* `ModifierTest` has been removed.

### Plot Points
* *FEATURE* The Plot Point Editor will now automatically updated the associated `PlotPointDatabase` scriptable object when a `PlotPointSequence` is created, modified or deleted.
* *REMOVE* `PlotPointDatabaseEditor` has been deprecated. It is no longer required due to Plot Point Editor changes.

### Rewards
* *FEATURE* Added new individual unit test for each rewards testing specific functions:
    * `AscensionRewardTest`, `CurrencyRewardTest`, `GachaRewardTest`, and `RandomTagsCurrencyRewardTest`
* *REMOVE* The `RewardTest` was removed due to the addition of individual tests above.

### TradeSet
* *REMOVE* Due to the refactor of trades, `TradeSet` has been removed. See `UPGRADENOTES.md` for more details.

### Welcome Back
* *FEATURE* Added the time the user is away for in the welcome back message.

### idlekit-examples

### Examples
* *CHANGE* The `examples_trade_tradedata` asset now includes a `tagConsumerData` field.
* *CHANGE* The Trade example UI prefab now holds a `cooldownDuration` to denote the time between each trade being offered.
* *CHANGE* `TradeUI` has been updated to account for changes to `CanvasTradeView`.

### idlekit-showcase

### Ascension
* *FEATURE* Added an ascension battle after the user click the `Ascend` button. That will serve as an example on how to handle the ascension transition.

### Asset Importer
* *CHANGE* `ShowcaseContentDataAssetCreator` now imports the `tradeCooldownDuration` field.

### Content
* *FEATURE* Added a new field to `ShowcaseContentData` that allows the user to set the base ascension power of that `IContent`.
* *FEATURE* `ShowcaseContentData` and `ShowcaseContent` now have a `tradeCooldownDuration` property.
* *CHANGE* `ShocaseContent` properties have been made virtual for extensibility.
* *CHANGE* `ShowcaseContentParameters` now takes a `Trade` array rather than the deprecated `TradeSet`.

### Event Content
* *FEATURE* Added extended classes to showcase the new Event Content system as well as one potential way to extend the implementation to add a limited time to Event Content.
* *FEATURE* Extended EventContent (ShowcaseEventContent) to add Event functionality to the showcase project. See UPGRADENOTES.md for more details.
* *FEATURE* Extended EventSettings (ShowcaseEventSettings) to showcase one potential way to implement limited time functionality in Events.
* *FEATURE* Added a global EntitiesDatabase to show how to manage and access data across multiple Contents.

### Events
* *FEATURE* Added ShowcaseEventEndedEvent and ShowcaseEventStartedEvent to provide support for limited time Events in the showcase project.

### Plot Points
* *CHANGE* Added `PlotPointUI` component to manage the UI  / PlotPoint flow. Now dialogs must be closed before PlotPoint playback will happen.

### Showcase Upgradeable Currency Manager
* *CHANGE* The arguments for the `ShowcaseUpgradeableCurrencyManager` constructor now require `ITagService`.

### UI
* *CHANGE* `CanvasTradeView.Initialize` now takes an array of Trade Entities and a trade cooldown value along with a `IDependencyContainer`.
* *CHANGE* `CanvasTradeView.OnCurrencyChanged` now only sets the `_acceptButton.interactable` field rather than re-generating the amounts within the trade.
* *CHANGE* `CanvasTradeView.SelectTrade` has been renamed to `RefreshTrade`.
* *CHANGE* `CanvasTradeView.RefreshTrade` is now nly called in `CanvasTradeView.OnTimerEnded` (whenever the trade timer ends).
* *CHANGE* `MakeExchangePlayerEvent` is now sent via `Trade.MakeTrade` rather than from UI code in `CanvasTradeView.HandleAcceptButtonClick`.

## Version 0.19.1, 2019-05-30

### idlekit-framework

* N/A

### idlekit-implementation

### Rewards
* *BUGFIX* Fixed an issue with the `AscensionReward` where only one reward would ever be granted.

### idlekit-tools

* N/A

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

## Version 0.19.0, 2019-05-27
### idlekit-framework

### Goals
* *FEATURE* Introduced `IDynamicGoalData` for `IEntityData` that are associated with a `IDynamicGoal`.
* *CHANGE* `IDynamicGoal` now requires an `IDynamicGoalData`  in the interface.

### Events
* *REMOVE* Removed deprecated `IActionManager` class.
* *REMOVE* Removed deprecated `IEventInvoker` class.

### idlekit-implementation

### Currency
* *REMOVE* Removed `CurrencyData.isActive` as it was not used.

### Generator
* *BUGFIX* The bug that any action which would cause a `ModifierIndexChangedEvent` would not immediate affect the `Generator` until the next time the Generator's payout is recalculated has been fixed.

### Events
* *REMOVE* Removed deprecated `EventInvoker` class.
* *REMOVE* Removed deprecated `LoadContentPlayerEvent`.
* *REMOVE* Removed deprecated `LoadStagePlayerEvent`.
* *REMOVE* `AscendPlayerEvent.GetRewardIds` has been deprecated. Equivalent functionality now exists in the new `AscensionReward` Entity controller.
* *CHANGE* `GrantRewardPlayerEvent` constructor now requires a `IEventManager` to be passed as an argument. This also effects the following derived classes:
  * `ClaimGoalPlayerEvent`
  * `CheckGeneratorUnitTargetHit`
  * `ClaimTimedRewardPlayerEvent`
  * `OpenTimerTrunkPlayerEvent`
* *REMOVE* `GrantRewardPlayerEvent.CalculateRewards` has been deprecated. Currency amounts for individual rewards are now calculated via `GrantRewardPlayerEvent.CalculateReward`.
* *CHANGE* `CheckGeneratorUnitTargetHit.CheckGeneratorUnitTargetHit` will now only call `CheckGeneratorUnitTargetHit.GrantRewards` if there is least one `IReward` to be granted.
* *CHANGE* `GrantRewardPlayerEvent` now emits a `RewardGrantedEvent` whenever a `IReward` is granted to the player.
* *FEATURE* `RewardGrantedEvent` has been added to signal when a `IReward` has been received by the player.

### Goals
* *FEATURE* Added new `CollectRewardTypeGoal` completes when the player is granted one or more specified `IReward`s, such as a `GachaReward`. Equivalent `Data` and `DataAsset` classes have also been added.
* *FEATURE* Added new `DynamicCollectCurrenciesWithTagsGoal` progresses or completes when the player collects from automated `IGenerators` that are producing `ICurrencies` that are associated with certain `ITagDatas`.
* *FEATURE* Added new `SpendCurrenciesWithTagsGoal` progresses or completes when the player spend `ICurrencies` that are associated with certain `ITagDatas`.
* *FEATURE* Added new `UpgradeCurrenciesWithTagsGoal` progresses or completes when the player upgrade `IUpgradeableCurrencies` that are associated with certain `ITagDatas`.
* *CHANGE* All `DynamicGoal` now have the fallback logic that if no automated `IGenerator` producing the required `ICurrency` is found, it will calculate the dynamic `IGoal.targetProgression` based on the average purchased `IGenerators.payoutCurrencyPerSecond` that are producing the correct `ICurrency`.
* *CHANGE* Introduce base abstract implementation for different `IGoal` archetypes: `CollectGoal`, `DynamicCollectGoal`, `SpendGoal`, and `UpgradeGoal`. Existing `IGoals` have been retrofitted to implement the abstract classes if applicable.
* *CHANGE* All `Goal`s no longer have the `Serializable` tag.

### Rewards
* *FEATURE* `AscensionReward` has been implemented to make it into a full Entity, inheriting from `IReward`. Some functionality from AscendPlayerEvent now lives within the `AscensionReward` controller.
* *CHANGE* `AscensionRewardData` now inherits from `IRewardData` and has the requisite `Create` method implemented.

### idlekit-tools

### CanvasView
* *BUGFIX* Fixed issue in `CanvasGeneratorView` where the buy max units button would attempt to purchase an invalid number of units after the final Unit Target had been reached.
* *BUGFIX* Having any `CanvasBoostView` objects in `CanvasContentView` should be optional.

### Data Importer
* *FEATURE* A new `CollectRewardTypeGoalDataAssetCreator` has been added to generate the `CollectRewardTypeGoalDataAsset`.
* *FEATURE* A new `CollectRewardTypeGoalDataAssetHeader` has been added.

### Debug Tools
* *BUGFIX* The debug ascend tool now purchases all Generators within a `Stage` to allow for their related Upgradeable Currencies to be granted via gacha rewards.
* *FEATURE* The debug ascend tool now grants rewards based on Unit Targets as well as the previously supported Goal rewards.
* *CHANGE* The debug reward tool now uses the `IRewardManager` to get rewards instead of directly creating them.
* *CHANGE* The debug reward tool now emits a `RewardGrantedEvent` to emulate the behavior of the `GrantRewardPlayerEvent`.

### Main
* *CHANGE* `OnAscensionComplete` now calls `LoadStage` instead of duplicating its functionality.

### Plot Points
* *BUGFIX* `PlotPointBaseActor.OnValidate` will now only update Actor Static Data when not dealing with a prefab.
* *CHANGE* Speech Bubble Actor font, color, style and alignment can now be set via the Plot Point editor tool.
* *CHANGE* Text Actor text color can now be set via the Plot Point editor tool.
* *CHANGE* `PlotPointSpeechBubbleActorData` now supports fields for text font, color, style and alignment.
* *CHANGE* `PlotPointTextActorData` now supports a field for text color.
* *FEATURE* Added "Delete" menu to the "Sequence" top dropdown. This will give you a dropdown to a chosen Sequence to delete, which includes deleting all of its Frames and removing its id from the `SequenceCollection.activators` that it was originally added to.

### idlekit-examples

### Examples
* *FEATURE* A PlotPoint Example has been added that is designed to be used in conjunction with a tutorial in the documentation.
* *CHANGE* The `GrantRewardFromRewardGeneratorPlayerEvent` has been updated to account for changes to `GrantRewardPlayerEvent`.

### idlekit-showcase

* N/A

## Version 0.18.1, 2019-04-18
### idlekit-framework
* N/A

### idlekit-implementation
* N/A

### idlekit-tools

### Plot Points
* *BUGFIX* Fixed a compile error when building PlotPoint code in device builds.
* *BUGFIX* Fixed an issue where PlotPoint scenery wouldn't be reactivated correctly.

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

## Version 0.18.0, 2019-04-15
### idlekit-framework

### Content
* *FEATURE* Added `long lastActiveTimestamp { get; set; }` to `IContentSavedData` that tracks the last time the player interacted with the app.

### Dependency Container
* *CHANGE* Added `void UnBind<T>()` to `IDependencyContainer` to make it more comprehensive and prepare the class further for the 1.0 IoC container update.

### Events & Actions
* *REMOVE* All `IActions` have had non `ISavedData` altering logic removed. Those logic has been moved to the callers and other listening classes, please refer to the changes to the `IActions` in the `idlekit-implementation` section of the `CHANGELOG.md`.
* *CHANGE* `IAction` has been renamed to `IPlayerStateEvent`. All occurrences of `IAction` have been modified to work with the new name.
* *CHANGE* `IAction.Do` has been renamed to `IPlayerStateEvent.Apply`. All occurrences of `IAction.Do` have been modified to work with the new name.

### Event Management
* *REMOVE* `IActionManager` has been deprecated after the merge.
* *REMOVE* `IEventInvoker` has been deprecated because all `IEvents` are dispatched immediately.
* *CHANGE* `IActionManager` has been merged into `IEventManager` and the APIs have been simplified. All occurrences of `IActionManager` have been changed to use `IEventManager`.

### Generator
* *REMOVE* `void RefreshCache()` removed from `IGeneratorEntity` from the interface but not in the implementation, please refer to the `UPGRADENOTES.md` for details.

### Services
* *REMOVE* `IEntity` register and de-registering methods have been removed from `ICurrencyManager`, `IModifierManager`, and `IRewardManager`, please refer to the `UPGRADENOTES.md` for details.

### Time Management
* *FEATURE* Added `ITimerSubscription` class that contains all the information in interchangeable time formats to be used with the `ITimerService`. This class is contained in an `ITimerListener`.
* *CHANGE* `ITimerService` interface has been changed significantly to work exclusively with `ITimerListener` for clarity. The `(ref int id)` parameter has been removed in all occurrences.

### Timed Reward
* *CHANGE* Renamed `void Begin()` to `void Initialize()` to stay consistent with the naming scheme in IdleKit.

### Unity Event
* *REMOVE* Remove `IService` from `IUnityEventListener` as it is usually meant to be used with or as a `MonoBehaviour` class and it is not doing anything in `IService.Load` and `IService.Cleanup`.

### User Data
* *CHANGE* `IUserSavedData` is no longer contained by the `ISavedDataManager` it is a stand alone object that can be injected with the `IEntityCache`.

### Naming
* *CHANGE* Cleanup all timestamp related name to just use `timestamp` or `Timestamp` as the name implies that it is in milliseconds.

### idlekit-implementation

### Events & Actions
* All `Action` have been renamed to `PlayerEvent`. The former name would be displayed in brackets:
  *  AscendPlayerEvent (AscendAction)
      * *CHANGE* `IStage` ending logic in the class has been moved to `Content` after the call to dispatch the `AscendAction`.
      * *CHANGE* `IGenerator` unregistering from `IModifierManager` logic is moved to the `ModifierManager` that listens to the `EntityRemovedEvent`.
  * AutomateGeneratorPlayerEvent (AutomateGeneratorAction)
    * *CHANGE* `IGenerator` processing logic in the class has been moved to `GeneratorEntity` after the call to dispatch the events.
  * BuyGeneratorPlayerEvent (BuyGeneratorAction)
    * *CHANGE* `IGenerator` processing logic in the class has been moved to `GeneratorEntity` after the call to dispatch the events.
  * CollectFromGeneratorPlayerEvent (CollectFromGeneratorAction)
    * *CHANGE* `IGenerator` processing logic in the class has been moved to `GeneratorEntity` after the call to dispatch the events.
  * IncrementGeneratorUnitPlayerEvent (IncrementGeneratorUnitAction)
    * *CHANGE* `IGenerator` processing logic in the class has been moved to `GeneratorEntity` after the call to dispatch the events.
  * ClaimTimedRewardPlayerEvent
    * *FEATURE* This event has been added to retain the previous behavior of `OpenTimerTrunkPlayerEvent`.
  * ClaimGoalPlayerEvent (ClaimGoalAction)
    * *CHANGE* `StageSavedData.ClaimGoal(int)` call that deals with goal track has been moved from `Stage` to `ClaimGoalAction` because it alters `ISavedData`
  * ClearContenPlayerEvent (ClearContentAction)
    * *REMOVE*  Removed the `void Initialize(IUserSavedData)` from the class as it is injected in the constructor.
    * *CHANGE* `IContent` clean up logic in the class has been moved to the `Main` class after the call to dispatch the `ClearContentAction`.
  * LoadContentAction
    * *REMOVE* The class has been deprecated and remove because it doesn't handle any `ISaveData` alterations.
    * *REMOVE* `ICurrency` loading logic has been moved to the `CurrencyManager` listening to the `SetContentAction`.
    * *REMOVE* `IReward` loading logic has been moved to the `RewardManager` listening to the `SetContentAction`.
    * *REMOVE* `IBoost` loading logic has been moved to the `ModifierManager` listening to the `SetContentAction`.
    * *REMOVE* `IContent` loading logic has been moved to `Main` after the `IContent` is set.
  * LoadStageAction
    * *REMOVE* The class has been deprecated and removed because it doesn't handle any `ISaveData` alterations.
    * *REMOVE* `IStage` loading logic has been moved to `Main` after the `IContent` is loaded.
  * LogLastActiveTimePlayerEvent
    * *FEATURE* Added `LogLastActiveTimePlayerEvent` to log the last active time of the player when the user save or pause the app.
  * NewUserPlayerEvent (NewUserAction)
    * *REMOVE*  Removed the `void Initialize(IUserSavedData)` from the class as it is injected in the constructor.
  * OpenTimerTrunkPlayerEvent (OpenTimerTrunkPlayerAction)
    * *CHANGE* `ITimedReward` re-initialization logic has been moved to `TimerTrunkInitializePlayerEvent`.
  * SerializationEvent
    * *FEATURE* Added `PreSerializationEvent` and `PostSerializationEvent` which contains the `ISavedData` that will be or were serialized.
  * SetContentPlayerEvent (SetContentPlayerAction)
    * *REMOVE*  Removed the `void Initialize(IUserSavedData)` from the class as it is injected in the constructor.
  * TimerTrunkInitializePlayerEvent
    * *FEATURE* Added to handle the re-initialization of the `ITimedReward`.
  * TimerTrunkStartEvent
    * *FEATURE* An event that denotes that the `ITimedReward` has begun.


### Event Manager
  * *REMOVE* The event/action queue has been removed from `ActionManager`, please refer to the `UPGRADENOTES.md` for details.
  * *REMOVE* `onActionQueueEmpty` has been deprecated due to the removal of the action queue. All `IEvent` call is now   dispatched instantly.
  * *CHANGE* `ActionManager` has been renamed to `EventManager`.

### Content
* *FEATURE* Added `AscensionCompleteEvent` that gets dispatched when the ascension sequence has been completed.
* *FEATURE* Added `ContentInitializedEvent` that gets dispatched when the `Content.Initialize()` call has ended.

### Context
* *CHANGE* `Context.cs` has been refactored to separate the creation of `IServices` from the binding of `IServices` to allow for easier method overriding in its derived classes.

### Entity Event
* *FEATURE* Added `EntityAddedEvent` and `EntityRemovedEvent` events which are triggered when the `IEntityController` is added to or removed from the `IEntityCache`.

### Goals
* *CHANGE* `GoalSavedData.normaizedProgress` will now return 1 rather than 0 when `targetProgress` is 0.
* *CHANGE* `CollectCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectCurrencyTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `CollectUpgradeableCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectUpgradeableCurrencyTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `DynamicCollectCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `DynamicCollectCurrencyTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `SpendCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `SpendCurrencyTypeGoal` see `UPGRADENOTES.md` for details.

### Modifier Management
* *CHANGE* `ModifierManager` now loads all the `IBoost` on `SetContentEvent`.

### Offline Activity
* *FEATURE* Added `OfflineActivityTracker` to handle the logic of keep track of all the time related activities that should occured while the app is in the background or terminated.
* *FEATURE* Added `OfflineProgressEvent` that gets dispatched if any time related activity occurred while the app is in the background.

### Time Management
* *CHANGE* `TimerService` has gone through major rework to work with the new interface format.
* *CHANGE* `TimerService.now` no longer always return `DateTime.UtcNow`, the current time is now being tracked and updated using the `OfflineActivityTracker` and `IUnityEventHandler.Update`.
* *CHANGE* All time stamp related variables have had their names changed to `timestamp` in milliseconds format for consistency.
* *FEATURE* Introduced `TimerUtil` to centralize all conversion between different time format.

### Services
* *CHANGE* The `IServices`, `CurrencyManager`, `UpgradeableCurrencyManager`, `ModifierManager`, `RewardManager`, `SavedDataManager`, `StaticDataManager` have their caches converted from lazy-initialization to initialization on `void Load()` and termination on `Cleanup()`.

### Saved Data Serialization
* *CHANGE* Timer based serialization has been moved from the `JSONSerializer` to the `SavedDataManager`.
* *FEATURE* Added `PreSerializationEvent` and `PostSerializationEvent` that get dispatched before and after `ISavedData` have been serialized.

### Timer Trunk
* *CHANGE* The `TimerTrunk` implementation has been refactored to better support resuming the game and switching content without forcing the trunk to restart, see UPGRADENOTES for more details.
* *CHANGE* The unlock functionality of the `TimerTrunk` implementation has been moved to the new `ShowcaseTimerTrunk` class, see UPGRADENOTES for more details.
* *CHANGE* An `initialDuration` field now allows for the initial subscription duration to vary from subsequent subscription durations.
* *CHANGE* As the duration of the trunk can now change, a new `targetDuration` property has been added. The `timeRemaining` field is now calculated from this property.
* *CHANGE* The Static and Saved data field types are now `TimerTrunkData` and `TimerTrunkSavedData` respectively, rather than the base interface types. The types of the accessor fields are unchanged.

### idlekit-tools

### CanvasViews
* *FEATURE* `CanvasContentView` has been added to contain UI elements for entities that are non-stage specific. This allows these elements to be initialized seperately from the stage specific elements. All non-stage specific elements have been moved from `CanvasStageView` to `CanvasContentView`.
* *CHANGE* `ReorderUpgradeableCurrencies` is now only subscribed to the event manager at the point that the content has been initialized to prevent content re-initialization forcing a re-ordering of the upgradeable currency UI elements.
* *BUGFIX* `CanvasTradeView` now activates trades only once the `StageInitializedEvent` has been received.
* *BUGFIX* `CanvasTradeView` now re-initializes trade list if a currency changes while the timer subscription is complete.
* *CHANGE* All `CanvasView` and its derivatives have had their `Initialize(...)` methods changed into either `Initialize(IDependencyContainer)` and `Initialize(IEntity, IDependencyContainer)` to reduce the dependency and pave way for the IoC Container.

### Debug UI Tools
* *CHANGE* `CanvasDebugContentTool` no longer calls `CleanupUI()`. The UI is now cleaned up from `main.cs` on the start of a stage so this is not required.

### Dummy Unity Event
* *FEATURE* Added `DummyUnityEventListener` in the `DummyContext` so all unit tests can listen to `IUnityEventListener` event.

### Offline Activity
* *FEATURE* Added `OfflineActivityTrackerTest` to test the newly implemented `OfflineActivityTracker`.

### Plot Points
* *CHANGE* `SaveSequenceDialog` now only allows pre-defined `PlotPointDatabases` and `SequenceCollections`. Please use the `Create` -> `IdleKit` -> `Plot Points` menu to create and setup the required assets.
* *CHANGE* Saving a sequence no longer clobbers an entire folder it thinks the frames are on, it will now only find the old frames and remove them before saving new ones.
* *CHANGE* The Plot Point Editor now saves Frame objects in the same directory as the Sequence objects.
* *CHANGE* If the id of a plot point already exists in the file system, you will only be able to save to that file.

### Welcome Back
* *CHANGED* `CanvasWelcomeBackDialog` has been moved from `idlekit-showcase` into `idlekit-tools` as it is also used by other examples. It has also been modified to work with the new `OfflineActivityTracker`.

### idlekit-examples

### Boost Example
* *CHANGE* The Boost example now uses the standard `Context` rather than `ExampleContext` so that boost data persists between sessions.

### Instance Example
* *CHANGE* The `InstanceContext` now recreates services that depend on the `LoaderService` to ensure that the `InstanceLoaderService` implementation is injected correctly.

### Prefabs
* *CHANGE* All example UI prefabs and scenes have been updated to take account of the addition of the `CanvasContentView`.

### idlekit-showcase

### Timer Trunk
* *FEATURE* The `ShowcaseTimerTrunk` has been added to contain logic specific to the showcase game, including the ability for the trunk to be unlocked at a specific stage.

### UI
* *CHANGE* The `ShowcaseUI` has been rationalized to follow the method naming convension of other UI elements.

## Version 0.17.0, 2019-03-15
### idlekit-framework

### Difficulty
* *REMOVE* `IDifficultyManager` has been removed from the project, see `UPGRADENOTES.md` for details..

### Entity
* *CHANGE* Added `IEntityCache` to handle the caching, lookup, and removal of all the `IEntityController` created in the project.
* *CHANGE* `void Cleanup(ILoaderService loaderService);` in `IEntityController` has been changed to `void Cleanup(IEntityCache entityCache);`, see `UPGRADENOTES.md` for details.

### Generator
* *REMOVE* `GeneratorRequirementIncrementData requirementIncrements { get; }` in `IGeneratorData` has been removed, see `UPGRADENOTES.md` for details.

### Goal
* *REMOVE* `ICurrencyGoal` has been deprecated in the project, see `UPGRADENOTES.md` for details.
* *REMOVE* `IGeneratorGoal` has been deprecated in the project, see `UPGRADENOTES.md` for details.
* *REMOVE* `float[] difficultyIncrement { get; }` in `IGoalData` has been removed from the project, see `UPGRADENOTES.md` for details.
* *FEATURE* Added `bool canClaim{get;}` and `float normalizedProgress {get;}` to `IGoalSavedData`.

### Loader
* *CHANGE* Added override version  of `TReturn LoadEntity<TReturn, TData>(string dataId)` that allows the user to not specify any instance id and creating a global unique instance per static data.
* *REMOVE* `IEntityController` caching has been moved to the newly created `IEventCache` class, see `UPGRADENOTES.md` for details.

### Logging
* *FEATURE* The `IPriorityLogger` has been added as an interface to allow logging out of information, warnings, errors and exceptions. The `IPriorityLogger` should be invoked via the `IdleKitLog` which now exists, along with various logger implementations, in in idlekit-implementation.
* *REMOVE* `IExceptionEvent` has been deprecated, use `IdleKitLog` instead to log exceptions.

### idlekit-implementation

### Entity
* *CHANGE* All `EntityController`'s `void Cleanup();` method have been updated to reflect the interface change.

### Event
* *REMOVE* `ErrorEvent` and `ExceptionEvent` have been removed. Code that used these previously has been switched over to using the `IdleKitLog`.
* *REMOVE* `GoalEvent` has been replaced with `ProgressGoalAction` and `SetGoalProgressAction`. See `UPGRADENOTES.md` for details.
* *CHANGE* Introduced `EntityEvent` to reduce redundancy in all the `IEvent` implementations. This can be used to make common `IEntityController` related `IEvent` in the future.

### Goals
* *CHANGE* All `Goals` now take an `IEventCache` in the constructor. This eliminates the need to inject `IEntityController` via the interface `ICurrencyGoal` and `IGeneratorGoal`.
* *CHANGE* Introduced base implementations of `IGoal` and `IGoalData` - `Goal` and `GoalData` to abstract the common functionality in all `IGoal`.
* *CHANGE* `AutomateSpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `AutomateGeneratorTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `BuySpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `BuyGeneratorTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `CollectCurrenciesOfRarityGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectCurrenciesWithTagsGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `CollectFromSpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectFromGeneratorTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `GetGeneratorUnitsForSpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `GetGeneratorUnitsForGeneratorTypeGoal` see `UPGRADENOTES.md` for details.
* *CHANGE* `GetUpgradesForSpecificCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `GetUpgradesForCurrencyTypeGoal` see `UPGRADENOTES.md` for details.
* *FEATURE* Created `ProgressGoalAction` and moved all `IGoal`'s savedData alterations into the `IAction`.
* *FEATURE* Created `SetGoalProgressAction` and moved all `IGoal`'s savedData alterations into the `IAction`

### Logging
* *FEATURE* The `IdleKitLog` has been added to allow for the logging of information from within IdleKit. `IdleKitLog` is a static class accessible globally within the framework. It wraps a `IPriorityLogger` implementation which can be changed via `IdleKitLog.RegisterLogger()`. Functionality is provided for logging information, warnings, errors and exceptions to the Unity console/log via the default `IPriorityLogger` implementations; `DebugLogger`, `DevelopmentLogger`, `ExceptionLogger` and `NullLogger`.
* *CHANGE* The `LoaderService.LoadEntity` will now log an exception when the `StaticDataManager` returns null rather than causing a `NullReferenceException`.

### Plot Points
* *BUGFIX* Fixed an issue where the `PlotpointSequence`s wouldn't clean up data between `ClearContentAction`s

### Static Data
* *CHANGE* The `StaticDataManager` will now output a log message rather than hard failing if a requested Entity or type does not exist in the Entities Database. See UPGRADENOTES.md for more details.
* *CHANGE* The `StaticDataManager` will now return empty arrays rather than null/defaults from methods that get collections of Entities when the requested Entity types do not exist. See UPGRADENOTES.md for more details.
* *CHANGE* `StaticDataManager.GetDataForIds` no longer returns an empty array whenever any of the requested Entity Ids are invalid. See UPGRADENOTES.md for more details.
* *CHANGE* `GetData<T>(Predicate<T>)` an array rather than a `IEnumerable`. See UPGRADENOTES.md for more details.

### idlekit-tools

### Context
* *CHANGE* Split out service loading calls in `Context` into a new `LoadServices()` method and updated `PlotPointContext` to implement this.
* *CHANGE* Introduced `ExampleContext` which overrides `SavedDataManager` for Example scenes.
* *BUGFIX* Example scenes now use `ExampleContext` to avoid loading incorrect Saved Data when switching between scenes.

### UI
* *BUGFIX* `CanvasUpgradeableCurrencyView` now correctly unsets currency related data on `Clear()`.
* *BUGFIX* `CanvasStageView` now only subscribes to `HandleCurrencyChangedEvent` after initializing Currency views.
* *REMOVE* Removed `CanvasHeaderView.cs` as it is no longer required in Showcase or Examples.
* *CHANGE* Renamed the `CanvasDebugGachaTool` to `CanvasDebugRewardTool` and modified it to allow the granting of all `IReward` rewards not just `IGachaReward` rewards.

### idlekit-example

### Context
* *CHANGE* `RewardGeneratorContext` has been renamed `RewardGeneratorExampleContext` and now inherits from `ExampleContext`.
* *CHANGE* Introduced `PlotPointExampleContext` which inherits from `PlotPointContext` and overrides `SavedDataManager` in the same way as `ExampleContext`.
* *CHANGE* Updated all Example scenes to use example specific contexts rather than `Context`.

### Example
* *FEATURE* Added a new instance example utilizing the instancing of `IEntityController` that allows the usage of multiple `IEntityControllers` with the same `IEntityData.id`

### UI
* *CHANGE* Updated `GachaUI` to inherit from `CanvasDebugRewardTool` rather than `CanvasDebugGachaTool`.

### idlekit-showcase

### Plot Points
* *CHANGE* Sample Plot Point assets using Trailer Park Boys assets have been replaced with new Idle Kit assets.
* *CHANGE* The example_ascension_available Plot Point has been added. This is intended to act as a sample for how Plot Points are authored.

### UI
* *BUGFIX* Removed Back button from Showcase UI as it is no longer used.

### Misc
* *BUGFIX* `ShowcaseContentDataAsset` now correctly references `ITradeData` rather than `TradeData` as a `GuidReference` tag.

## Version 0.16.0, 2019-02-19

### idlekit-framework

### GeneratorStageData
* *REMOVE* No longer required as the `IStage` now just takes an array of `IGeneratorEntityData`s.

### IBoost
* *CHANGE* Moved `IBoostSavedData.isActive` to `IBoost.isActive`, since not all `IBoostSavedData` would store its activation status.

### IContext
* *FEATURE* Moved over to the framework instead of the implementation layer. Defines a class that provides an `IDependencyContainer` and can both bind and release dependencies from it.

### ICurrency
* *FEATURE* `ICurrency`, `ICurrencyData`, and `ICurrencySavedData` now extend the `IUnlockable`, `IUnlockableData`, and `IUnlockableSavedData` interfaces.

### ICurrencyManager
* *FEATURE* Introduced `T[] GetAllCurrencies<T>(Predicate<T> predicate)` that allows querying of `ICurrency` with customized predicate.
* *FEATURE* Added `ICurrency[] GetAllCurrenciesWithAvailability(bool availability)` to get `ICurrency` with `availability`.

### IEntityController
* *FEATURE* Defines an object that is a controller in the MVC pattern, see UpgradeNotes for more details on converting your objects to use this interface.

### IEntityData
* *FEATURE* Defines an object that is the model to the IEntityController. This object will create its controller through the required methods. Extends and functions like a IStaticData otherwise.

### IGenerator
* *CHANGE* Added `MeetsAutomationCost` for checking whether or not the user has reached the currency cost required for `CanAutomate`. Does not check upgrade requirements like `CanAutomate`.
* *CHANGE* Added `MeetsBuyCost` for checking whether or not the user has reached the currency cost required for `CanBuy`. Does not check upgrade requirements like `CanBuy`.
* *REMOVE* No longer uses the DateTime struct. Only requires the `timestampMs`.
* *CHANGE* Added `IsBought` to the generator.
* *CHANGE* Now holds a `IGeneratorEntityData` as the `IEntityData`. Still holds a `IGeneratorData` as it's "defining" data.

### IGeneratorBalanceData
* *CHANGE* This `IStaticData` is now wrapped by the `IGeneratorEntityData`.

### IGeneratorData
* *CHANGE* No longer requires `isContentSpecific`. This data is now wrapped by the actual `IEntityData` called `IGeneratorEntityData`.

### IGeneratorEntityData
* *CHANGE* The `IEntityData` to the `IGenerator` controller. Handles all the necessary required functions, but holds no raw data and instead wraps the `IStaticData`s: `IGeneratorData`, `IGeneratorUnitTargetSequenceData`, and `IGeneratorBalanceData`.

### IGeneratorUnitTarget
* *REMOVE* Controller was removed as it did nothing but hold data. This `IStaticData` is now wrapped by the `IGeneratorEntityData`.

### IGeneratorSavedData
* *REMOVE* `_startProductionTotalMs` is removed as `IGeneratorSavedData` implements `ITimedSavedData`.

### IGoal
* *CHANGE* Added `Ascend()` and `Reset()` calls for handling their own logic instead of the `IStage`.

### IGoalSavedData (IGoalSequenceSavedData)
* *FEATURE* This saved data is now owned by the `IGoal` instead of the `IStage`.

### ILoaderService
* *CHANGE* All specific load methods have been removed from ILoaderService and the derived `LoaderService`. Loading is now performed by a generic loading methods using the `IEntityController`'s static data's `IEntityData.Create` method. See `ILoaderService` for new interface functions and `LoaderService` in idlekit-implementation for examples.

### IStage
* *FEATURE* Now supports both `GetGoal(string id)` and `GetActiveGoal(int index)`, where `GetGoal` allows the fetching of completed or inactive goals.
* *CHANGE* Due to the above feature, `GetGoal` will now return the goal regardless of activity or completely.

### IStageData
* *CHANGE* No longer requires `GeneratorStageData`s as they are not encompassed by a single static data `IGeneratorEntityData`. A list of guid strings is used instead.

### IStageSavedData
* *CHANGE* No longer handles goal saved data.
* *CHANGE* Now handles `goalIndex` and `slotIndex` directly.

### IStaticData
* *INFO* While the idea that static data is serialized data has not changed, the addition of `IEntityData` means that static data can now be used as data 'chunks' that don't necessarily create an `IEntityController`, but are loaded to feed information to a system or loaded as a wrapper to a particular piece of an `IEntityData`'s model.

### ITimedRewardSavedData
* *REMOVE* `startTimestampMs` is removed as `ITimedRewardSaveddata` implements `ITimedSavedData`.

### ITimedSavedData
* *CHANGE* Add `ITimedSavedData` interface for `ISavedData` that is going to be store a timestamp in milliseconds.

### IUnlockable
* *FEATURE* Introduced `IUnlockable` which marks an IEntity as `available` and `obtained` to allow it to be enabled or disabled during certain in-game functions such as `RandomTagCurrencyReward`.
* *FEATURE* Introduced `IUnlockableData` and `IUnlockableSavedData` to accompany the addition of `IUnlockable`.

### IUpgradeableCurrency
* *FEATURE* `IUpgradeableCurrency`, `IUpgradeableCurrencyData`, and `IUpgradeableCurrencySavedData` now extend the `IUnlockable`, `IUnlockableData`, and `IUnlockableSavedData` interfaces.
* *CHANGE* Removed `isOwned` and `isUnlocked` as they are now covered by the `IUnlockable` interface.

### IUpgradeLevelData
* *CHANGE* `IUpgradeLevelData` and `IUpgradeRequirement` have been added to the interfaces.

### Miscellaneous
* All instances of `Load`, `Begin`, and `End` that existed in Entities or Actions have been converted to `Initialize` and `Cleanup` calls. This is only a naming consistency refactor. All uses of the previous naming should be clearly marked in your compiler errors via `System.Obsolete`.
* The GuidReferenceable tag on all DataAssets now correctly references derived rather than interface types.

### idlekit-implementation

### ActionManager
* *BUGFIX* Fixed an issue with `DispatchEventImmediate()` where an exception event would not be fired if a non-IAction was passed as an argument.

### BoostData
* *CHANGE* Now implements a `IniitalizeModifierData` method which initializes any modifier data on a boost.

### CollectFromGeneratorAction
*CHANGE* The constructor now only requires `ICurrencyManager` and `ITimerService` to be passed as dependencies.

### Content
* *CHANGE* On `Cleanup` the `Content` will now end the current stage, deregistering it from the `LoaderService` before then deregistering itself.
* *CHANGE* `rarity` (previously `rarityData`) is now optionally null.

### GachaReward
* *CHANGE* `allowAsRandomReward` is removed and moved to `RandomTagCurrencyReward.allowUnobtained`. Their respective `IStaticData` and `ISavedData` have also been changed to reflect this move.
* *CHANGE* `CanClaim` now returns false if any of its `GachaSlot`s returns false for `HasClaimableItem`.

### GachaSlot
* *FEATURE* Added `HasClaimableItem` which returns whether or not it has at least one `GachaItem` within it that `CanClaim`.

### Generator
* *CHANGE* The controller class has been renamed to `GeneratorEntity`, see UPGRADENOTES.md for more details.
* *CHANGE* Now caches values retrieved by the `DifficultyManager`.
* *CHANGE* Implements `IsBought`.

### Goal
* *CHANGE* `GoalSequenceSavedData` has been replaced by `GoalSavedData`. Each `Goal` now has it's own `GoalSavedData`. Member variables related to slots and goal indicies have been removed. See UPGRADENOTES.md for more details.
* *CHANGE* `GoalSavedData` now implements `Load`, `Save`, `Delete` and `Reset` methods. The `Reset` method is now called from the `Claim` and `Ascend` methods.
* *CHANGE* All `Goal` implementations now implement `Ascend` and `Reset` methods which call the equivalent methods on their `GoalSavedData`.

### GuidReferenceHelper
* *CHANGE* Added a sanity check to prevent empty and null ids from getting into the cache.

### LoadContentAction
* *CHANGE* The LoadContentAction now contains specific methods for loading of `IRewards`, `IBoosts` and `ICurrencies` which are invoked prior to loading the `IContent`.

### LoaderService
* *CHANGE* The constructor now requires that only the `IDependencyContainer` is passed as a dependency.

### RandomTagCurrencyReward
* *BUGFIX* Fixed issue where `CanClaim` threw an exception if it was ever false
* *CHANGE* Now holds a list variable instead of creating a new one each `RefreshValidCurrencies` call. Will still clear and repopulate the reference List each validation step.

### StaticDataManager
* *CHANGE* Remove the usage of `System.Linq` in `StaticDataManager`.

### TimedBoost
* *CHANGE* Add property duration to `TimedBoost` to have it calculated dynamically.

### TimedBoostSavedData
* *CHANGE* No longer extends `BoostSavedData` and now extends `ITimedSavedData`.

### ToggleAvailableAction
* *FEATURE* Added `ToggleAvailableAction` to toggle `IUnlockable.available`.

### ToggleBoostAction & ToggleTimedBoostAction
* *CHANGE* `ToggleTimedBoostAction` is no longer called in place of a `ToggleBoostAction`. It is now a stand alone extension of `ToggleBoostAction` that needs to be fired explicitly. It remains polymorphic, so global listeners to `ToggleBoostAction` continue to receive events from `ToggleTimedBoostAction` dispatches.

### UpgradeableCurrency
* *CHANGE* The `UpgradeableCurrencyData` now contains a `InitializeModifierData` method which will initialize the modifier data that it owns.
* *CHANGE* Due to the addition of `IUnlockable`, `IUnlockableData`, and `IUnlockableSavedData` interfaces, some functionality of this class has changed. Code that previousily utilized `UpgradeableCurrency.isOwned` and `UpgradeableCurrency.isUnlocked` have been updated.

### UpgradeLevelData
* *CHANGE* `UpgradeLevelData` and `UpgradeRequirement` now inherit from `IUpgradeLevelData` and `IUpgradeRequirement` respectively. See UPGRADENOTES.md for more detail.

### Miscellaneous
* *CHANGE* All Entitiy `DataAssets` have had their `GuideReferenceable` tags updated to register with their concrete rather than interface types.
* *CHANGE* Many getter methods have been replaced with expression bodied members.

### idlekit-tools

### AssetImporter
* *CHANGE* `DataAssetImporter` has been split out into framework vs showcase specific implementations. See UPGRADENOTES.md for more details.
* *CHANGE* `TagDataAssetCreator` and `RarityDataAssetCreator` no longer share a base class.
* *CHANGE*  `BaseAssetCreator`, `CurrencyAssetCreator` and `UpgradeableCurrencyAssetCreator` now supports importing of `Tag` data.
* *CHANGE* Improved feedback in Data Asset Importer Window when CSV path is invalid.
* *CHANGE* `BaseDataAssetCreator` now implements the path to which constant data headers are output instead of `BaseDataAssetImporter`. This allows for each implementation of `IDataAssetCreator` to override this path if required.
* *CHANGE* `GeneratorEntityDataAssetCreator` and `GeneratorEntityDataAssetHeader` have been added to support changes to `Generator` data structures. See UPGRADENOTES.md for more details.
* *CHANGE* The `isContentSpecific` flag has been removed from `GeneratorDataAssetHeader`.
* *CHANGE* Sparse arrays are no longer allowed in data structures. See UPGRADENOTES.md for more details.

### idlekit-example

### LoopingContent
* *CHANGE* As they are no longer required due to Framework changes, `LoopingContext` and `LoopingContentLoaderService` have been removed.

### TimerTrunk
* *CHANGE* Removed unrequired `Enable()` and `Disable()` methods from `CanvasTimerTrunkView`.

### idlekit-showcase

### AssetImporter
* *CHANGE* `DataAssetImporter` has been split out into framework vs showcase specific implementations. See UPGRADENOTES.md for more details.
* *CHANGE* `ExampleContent` has been renamed `ShowcaseContent`. See UPGRADENOTES.md for more details.
* *CHANGE* The showcase asset importer now outputs showcase specific constant data headers into a folder within the showcase project rather than tools.

### ExchangeRates
* *CHANGE* `mg01_missingresources_exchangerate_ExchangeRateDataAsset` asset has been renamed to `mg01_exchangerate_missingresources_ExchangeRateDataAsset`.
* *CHANGE* Exchange rates for rare and common trades have been added.

### ShowcaseContentLoaderService
* *CHANGE* As this class is no longer required due to Framework changes, it has been removed.

### ShowcaseContext
* *CHANGE* No longer overrides `_loaderService`.

### Trades
* *CHANGE* The default Trade example has been replaced with three seperate trades which allow for trading of common character and generator cards along with rare character cards for soft currency.

### Miscellaneous
* *CHANGE* A number of UI elements now take `IDependencyContainer` as an argument rather than `DependencyContainer`.
* *CHANGE* A number of getter methods have been replaced with expression bodied members.

## Version 0.15.0, 2019-01-07

### PlotPointManager
* *BUGFIX* PlotPoint Sequence Collections are now correctly cleaned up when a stage ends to prevent caching of invalid data.

### AscendAction
* *BUGFIX* When granting a RandomRarityCurrencyReward the AscendAction now correctly sets whether the reward can be granted when locked based on the AscensionRewardData's allowAsRewardWhenUnowned flag.

### GrantRewardAction
* *CHANGE* Now has a specific exception thrown when no valid reward can be found: InvalidRewardClaimException.

### ICurrency
* *CHANGE* ICurrency now requires that a ContainsTagOrRarity() method is implemented. See UPGRADENOTES.md for more details.

### ICurrencyManager
* *CHANGE* ICurrencyManager now requires that a GetAllCurrenciesOfTagOrRarity() method is implemented. See UPGRADENOTES.md for more details.

### IGlobalUpdateManager -> IUnityEventListener
* *CHANGE* IGlobalUpdateManager has been replaced with IUnityEventListener which uses C# events instead of holding on to IList of interface delegates (i.e: IUpdateable). Please see UPGRADENOTES.MD for more details.

### ITimedRewards
* *CHANGE* Added these entity interfaces to dictate the implementation of a reward that is dependent on a timer

### ITimerService
* *CHANGE* The specific implementation of the TimerSubscription has been moved to another file TimerSubscription.cs
* *CHANGE* TimerService now uses a Dictionary for ITimerListener subscriber lookup for better performance

### Example Project
* *FEATURE* Trade functionality has been implemented in the Example Project via the TradeSet, Trade and TradeData classes. See CanvasTradeView.cs for an example.
* *FEATURE* Extended the Content (ExampleContent) to provide more "game like" elements to the example without dirtying up the core IdleKit code. See UPGRADENOTES.md for details.
* *FEATURE* Extended the Context to support Example specific extensions of services.
* *FEATURE* ITimedReward is used for a simple implementation of the TimerTrunk concept is now in the example main game. It is works like a Reward Id that is retrieved through a button, of which is disabled until a certain TimerService listener reaches the end of its timer. Extends ITimedReward.
* *CHANGE* Improved error handling in Main.cs to output a stack trace of ExceptionEvents where available.
* *CHANGE* A BaseContentDataAssetCreator has been implemented in the importer. See UPGRADENOTES.md for more detail.

## Version 0.14.1, 2018-11-26

### IModifierManager
* *CHANGE* The specific implementation of the ModifierCache has been moved into another file.
* *CHANGE* ModifierCache.SearchModifierAffectingId<TModifierCategoryData> now returns an IEnumerable instead of a SortedSet.
* *BUGFIX* Fix a bug where multiple IModifiers with the same modifiableId and same ModifierCategoryData.priority would only count once in Modifier related calculations.

## Version 0.14.0, 2018-11-23

### IContent
* *CHANGE* Content now uses a simple sequential Stage list in ContentData to determine the Stage transition. See UPGRADENOTES.md for more details.
* *CHANGE* IContext and Dependency Container have been moved from the idlekit-example into idlekit.
* *CHANGE* Extracted the looping and index based stage transition logic from Content and created the LoopingContent subclass in the example project.

### ICurrency
* *FEATURE* Rarity and Tag functionality has been implemented via IRarityData and ITagData. RarityData is now an extended ITagData See UPGRADENOTES.md for more details.

### ICurrencyManager
* *CHANGE* Add unit test coverage for all public methods of ICurrencyManager and IUpgradeableCurrencyManager.
* *CHANGE* Deprecated Currency.Get, see UPGRADENOTES.md for details.
* *CHANGE* ICurrencyManager no longer loads ICurrency, instead ICurrency is loaded and registered with the ICurrencyManager in LoadContentAction

### IEconomy
* *CHANGE* Economy methods related to generator units have been refactored. See UPGRADENOTES.md for more details.

### IExchangeRate & IExchangeables
* *FEATURE* IExchangeRate now allows for a rate to be calculated when trading IExchangeables, such as Currency. See UPGRADENOTES.md and Content.cs for more details.

### IEvent
* *CHANGE* Added ExchangeEvent and TradeMissingResourcesAction to support missing resources exchange rate functionality.

### IGenerator
* *CHANGE* Added ExceptionEvent to the IGenerator in case functions are called to the IGenerator while the GeneratorState is null
* *CHANGE* IGenerator no longer register and unregister itself with the IModifierManager

### ILoaderService
* *FEATURE* Added the ability to load ICurrency, and IReward (by id, ids, and load all in IContent) to the ILoaderService
* *CHANGE* ILoaderServices has been updated to work with string ids instead of specific concrete class.

### IModifierManager
* *CHANGE* IModifiers no longer register directly with the IModifierManager. They are being registered to IModifierManager in LoadContentAction and LoadStageAction

### IReward
* *CHANGE* Removed RewardResult class as it is no longer useful
* *CHANGE* Removed ICurrencyAmount as it was boxing the struct concrete implementation

### IRewardManager
* *CHANGE* IRewardManager no longer loads IReward, instead IRewardManager is loaded and registered with the IRewardManager in LoadContentAction

### IUpgradeableCurrency
* *CHANGE* IUpgradeableCurrency no longer register and unregister itself with the IModifierManager
* *CHANGE* Now fires a new action, CurrencyUnlockedEvent whenever isUnlocked flips from false to true

### Example Project
* *FEATURE* A "Welcome Back" dialog now spawns to inform the user of how much has been generated since the app's last pause/exist.
* *BUGFIX* Importer no longer crashes Unity on exceptions.
* *FEATURE* Added functionality to allow the player to exchange for missing resources when they do not have enough resources to upgrade an upgradeable currency.

## Version 0.13.1, 2018-10-30
### HOTFIX
* *CHANGE* EventInvoker is now a class instead of a struct to avoid boxing allocation.
* *CHANGE* Added unit test for the interface methods of IActionManager and IEventManager.
* *CHANGE* Added exception when passing an IAction into DispatchEventImmediate and updated the documentation for that method.
* *BUGFIX* Fixed ActionManager.cs DispatchEventImmediate not firing target specific event dispatch.

## Version 0.13.0, 2018-10-26

* *FEATURE* Introduced TestDataBuilder<T> that can help with creating IStaticData quickly in unit tests.
* *FEATURE* Added new error checking for more possible points of error when creating the IGoal and IGoalData.
* *FEATURE* Can now fire events from the ActionManager immediately, instead of adding them to the queue. This does not include actions.
* *FEATURE* Introduced IEventPools so that all IEvent and IAction are no longer being instantiated everytime they are dispatched. This requires any asynchronous listener to cache an event's members as they will be cleared once the event re-enters the pools.
* *FEATURE* To allow for more performant practices, event management now has instance specific subscription/dispatching. Each listener can listen to a single specific object's dispatching of that event. This does require the listener to have that object's reference.
* *CHANGE* DynamicCollectCurrencyGoal has been changed from using only the automated IGenerators' payoutPerSecond to using all the purchased IGenerators' payoutPerSecond when calculating its dynamic target.
* *CHANGE* Modified all existing unit tests to adopt to the TestDataBuilder pattern to get rid of long-winded test setup code.
* *CHANGE* Performed unit test passes on all the Goals to ensure coverage of all the newly added error-checkings and exceptions.
* *CHANGE* Changed JsonSerializer to not serializeDirty every LateUpdate but instead with an constant interval defined in the JsonSerializer class.
* *CHANGE* Removed unused technical requirements such as IStaticData.Create, IGuidReferenceableAsset.dataType, and IGuidReferenceableAsset.ResetId.
* *CHANGE* IGenerators in the AutoCollectState will batch collect calls within a time frame together if the speed of the IGenerator is too fast to prevent from rapid calling of CollectFromGeneratorAction.
* *CHANGE* Cleaned up the dependencies in all IGeneratorState and remove the Automate() method from IGeneratorState to have it done in AutomateGeneratorAction.
* *CHANGE* Removed id argument from IStaticDataManager.AddData and removed overloaded implementation to simplify API.
* *CHANGE* Altered the ActionManager to encompass any events into InvokerObjects. Internally, this allows the events to be queued while still being strongly typed, therefore removing a dynamic invokation. This was a very large performance improvement in stress tests.
* *CHANGE* Polymorphic dispatching is no longer enforced. Instead, each IEvent has a Type[] dispatchAs property that allows each class to inform the EventManager which type of listeners it wishes to invoke. View the code documentation for additional details.
* *CHANGE* IdleKit uses, internally, the instance specific dispatching and subscribing as described in the Features.
* *CHANGE* Generators now cache their payouts and speeds, re-caching whenever something could cause them to be altered. See ModifierIndexChangedEvent and IncrementGeneratorUnitAction.
* *CHANGE* Upgraded the targeted .NET framework version to 4.x
* *BUGFIX* Solved an issue where AutoCollectState, when entered from the WaitToCollectState, could collect based on the last time the ProductionState was entered. AutoCollectState has more strict checks on enter.
* *BUGFIX* GetGeneratorUnitsForAllGeneratorsGoal now keeps a list of IGenerators that have been reached to prevent double counting towards the goal progress.

## Version 0.12.2, 2018-10-03

* *BUGFIX* Fix device build error by removing AssetDatabase.FindAssets in runtime PlotPointDataProvider.
* *BUGFIX* Fix starting with an automated IGenerator on a new playsession would not collect the currency gained since the previous playsession.
* *BUGFIX* Fix warnings that were previously suppressed by the UnityEditor by removing non-numeric characters in #pragma warning disable.

## Version 0.12.1, 2018-10-01

* *BUGFIX* Fixed issue where AutoCollectState would automate all time between last start production and the time that it was entered. It no longer fires collection events on entry and will continue where other states, like the ProduceState, left off.
* *CHANGE* IGeneratorState now takes the previous IGeneratorState in the Enter method and the next IGeneratorState in the Exit method.

## Version 0.12.0, 2018-09-28

* *FEATURE* Added Plot Points to IdleKit.
* *FEATURE* Introduced IEvent and the derived ContentEvent, CurrencyEvent, GeneratorEvent, GoalEvent, ModifierEvent, StageEvent that can be sent and listened to across different Entities, Services, and Actions.
* *FEATURE* Introduced IEventManager that allows the subscription, un-subscription, and dispatching of IEvents.
* *FEATURE* IdleKit now uses the Event system for communication instead of relying on directly referencing the object of interests.
* *FEATURE* Introduced an action queue system to be used inside the IActionManager for IAction management and dispatch. IActions triggered on the same frame will now be treated as a proper queue instead of a stack.
* *FEATURE* Introduced the ILoaderService to create and preload the Entity classes with the proper dependencies.
* *FEATURE* Introduced the IActionPrototypeFactory to register and clone all IActions to reduce the dependency and allow inheritance and overloading.
* *FEATURE* Introduced CollectUpgradeableCurrencyGoal with an "any" field to allow the goal to track any UpgradeableCurrency obtained.
* *FEATURE* Added a ToggleBoostEvent for turning IBoosts on or off.
* *FEATURE* Added ErrorEvent and ExceptionEvent which get sent instead of Exceptions being thrown that may soft-lock the game. We plan to do an error handling pass in the future sprint this is only a temporary solution.
* *CHANGE* IAction is now an IEvent. Upon completion of the IAction, the IAction event will be dispatched, which can be subscribed to any listener.
* *CHANGE* Modified the entity classes such as Content, Currency, Generator, Goal, and Stage classes to adapt to the new Event and Loader system.
* *CHANGE* Modified the service classes to adapt to the new Event system.
* *CHANGE* Changed the Generator unit cost's mathematical formula to reflect the Customer cost in TPB.
* *CHANGE* Moved the DataAssetImporter from IdleKit into Example #3.
* *CHANGE* Trimmed down IRewardManager to remove confusing Claim() methods.
* *CHANGE* Introduced IValidatableReward, an reward that requires validation before it can be granted. For example, the GrantGachaRewardAction can validate the IValidatableReward before adding it to the reward pool.
* *CHANGE* GrantCurrencyReward and GrantRandomRarityCurrencyReward actions now grant the IReward without checking the whether the user has unlocked the UpgradeableCurrency or not. The validity check has been moved to IValidatableReward.
* *CHANGE* Goals now support being reused within the same Stage asset.
* *CHANGE* Generators now fire GeneratorPayoutChangedEvents and GeneratorSpeedChanged events.

## Version 0.11.0, 2018-08-17

* *FEATURE* Introduced IBoost that represents modifiers that should not be tied to other entities and instead have their own internal logic.
* *FEATURE* Introduced simple implementations of IGlobalUpdateManager and ITimerService into IdleKit.
* *FEATURE* Introduced ISavedData.Reset as a more optimal way to reset a saved data than previously Delete followed by a Load.
* *CHANGE* Refactored all Services/Managers to get rid of loading dependency chain on the start-up script.
* *CHANGE* Added ICurrency accessor to CollectCurrencyGoal.
* *BUGFIX* Fixed a bug where the DataImporter would not import item indexed more than 10 due to faulty regex.

## Version 0.10.0, 2018-08-17

* *FEATURE* Introduced ISavedData interface for all EntitySavedData, which allows the user to implement their own saved data.
* *FEATURE* Introduced ISerializer and injected it in all EntitySavedData to handle Save, Load, and Delete operations.
* *CHANGE* Replaced IKeyValueSave with ISerializer so the users can specify their own way of serialization.
* *CHANGE* Split IUserData into IUserSavedData to store user data and ISavedDataManager to manage loading of ISavedData.
* *CHANGE* Renamed IDataManager to IStaticDataManager for clarification.

## Version 0.9.1, 2018-08-14
* *FEATURE* Added onRewardGranted event to IRewardManager when a reward is granted.
* *FEATURE* Introduced ICurrencyReward for IRewards that grant ICurrency.
* *FEATURE* Introduced IRewardResult to pass the IReward granted information to the view.
* *FEATURE* Added onCurrencyRewardGranted event to be fired in the GrantRewardAction when ICurrencyReward is granted.
* *BUGFIX* Fixed a bug that GachaReward is granting the IReard even if AllowAsRandom is turned off.
* *CHANGE* Moved all IReward claiming logic into GrantRewardAction instead of it being in the IReward.

## Version 0.9.0, 2018-08-02

* *CHANGE* Extracted Modifier related logic from IEconomy into IModifierManager.
* *CHANGE* Removed IEconomy dependency from IDataManager and IUserData.
* *CHANGE* Moved GeneratorUnitTarget related ModifierData into GeneratorBalanceData.
* *CHANGE* Introduced IModiferData interface and IModifierCategory entity to process ModifierLogic.

## Version 0.8.0, 2018-07-25

* *CHANGE* Major refactor of the following names to make IdleKit more general:
	* IBusiness -> IGenerator
	* BusinessSaveData.progression -> GeneratorSaveData.generatorUnitTarget
		* All usages of the words like progression or customer for describing an IBusiness have been changed.
	* IBreakpoint -> IGeneratorUnitTarget
	* IBreakpointSequence -> IGeneratorUnitTargetSequence
	* ISeason -> IStage
	* IGacha -> IGachaReward
	* IModifierData -> IModifierDataCollection
	* IContentData.PlaythroughDatas -> IContentData.StageSequenceDatas
* *CHANGE* DataAssetImporter contains hooks when the DataAssets are created now.

## Version 0.7.15, 2018-07-16

* *FEATURE* DataAssetImporter that creates EntityDataAssets from CSVs.
* *FEATURE* OpenGachaAction implemented so GachaReward can be properly granted in the frontend.
* *FEATURE* Comments improved and updated throughout the entire codebase.
* *BUGFIX*  Fix the issue that CurrencyReward only grants the minimum currency amount.
* *BUGFIX*  Fix the issue that DynamicCollectCurrencyGoal includes Businesses that do not generate the target currencyId in the calculation of targetProgression. Also, add a unit test to test it.

## Version 0.7.14, 2018-07-05

* *BUGFIX*  Sets the target amount of HitBreakpointsGoal to be the remaining breakpoints in that season if there are less breakpoints remaining than the initial target amount.

## Version 0.7.13, 2018-06-28

* *BUGFIX*  Fixed SpendCurrencyGoal to check for a negative difference value.

## Version 0.7.12, 2018-06-27

* *CHANGE*  New AddData method in DataManager that allows passing explicit types as parameter in order to suppot IL2CPP.

## Version 0.7.11, 2018-06-26

* *CHANGE* OnCurrencyChangedHandler now also has "double difference" as part of the handle.
* *BUGFIX* Above fixes issue where changing currency in an amount 15 digits lower than the current amount would not increment any goals.

## Version 0.7.10, 2018-06-21

* *BUGFIX* Separated business state initialization and activation in order to activate goals after business state is initialized but before they get activated.
* *BUGFIX* Fixed all unit tests.

## Version 0.7.9, 2018-06-20

* *BUGFIX* Create and activate goals before businesses so goals can track business collection.

## Version 0.7.8, 2018-06-19

* *BUGFIX* Pass a count when firing business onCollect so the correct number of collects are tracked in goals.

## Version 0.7.7, 2018-06-18

* *CHANGE* Refactor ITimerService and ServerTime offset.

## Version 0.7.6, 2018-06-15

* *CHANGE* Removed isActive field from static data that won't use it.

## Version 0.7.5, 2018-06-07

* *CHANGE* Added isActive field in static data.

## Version 0.7.4, 2018-06-06

* *CHANGE* Synced IdleKit changes into Fenwick Repo which resolves some Core Dependencies to DateTimeExtensions and removes unused variables to remove warnings.

## Version 0.7.3, 2018-06-06

* *CHANGE* Caching ModifierDatas array outside for loop to avoid constant calls in il2cpp.

## Version 0.7.2, 2018-06-05

* *CHANGE* Added a cached dictionary of unique modifiers affecting a modifiable.

## Version 0.7.1, 2018-06-04

* *CHANGE* [Refactor] SavedData objects now have the ability to choose game states (if any) that they will allow deletion of their local saved data.
* *CHANGE* CurrencyManager further virtualized.
* *CHANGE* SavedDatas further virtualized.
* *CHANGE* IBusiness now has "MeetsBuyUnlockRequirement" and "MeetsAutomationUnlockRequirements" to separate requirements from costs.
* *BUGFIX* Default values that were missing in Saved Datas have been added.
* *BUGFIX* All saved datas were not persisting, they will now unless they explicitly set to do so (as per the first *CHANGE* described).
* *BUGFIX* Season now checks for unlock state as it loads.

## Version 0.7.0, 2018-06-01

* *BUGFIX* Fixed GetCustomersForAllBusinessesGoal and GetCustomersForBusinessGoal having incorrect targetProgressions.

## Version 0.6.41, 2018-06-29

* *BUGFIX* Fixed a bug where IUpgradeableCurrencyData are not showing in GetUpgradesForSpecificCurrencyGoalDataAsset.
* *CHANGE* Added a parameterized constructor for CurrencyAmount, which is needed for the DataImporter .

## Version 0.6.40, 2018-06-27

* *BUGFIX* Fix all of the Unit tests.
* *CHANGE* Add TODOs to classes that require revisit.

## Version 0.6.39, 2018-06-01

* *CHANGE* Removed dependency to DateTimeExtensions from AutoCollectState and ProduceState.
* *CHANGE* Fixed compiler warnings in BuyBusinessAction, CollectFromBusinessAction and OpenGachaAction.

## Version 0.6.38, 2018-05-29

* *BUGFIX* Second fix for GetUpgradeForSpecificCurrencyGoal to trigger goal completion when the goal is already met.

## Version 0.6.37, 2018-05-24

* *BUGFIX* Fixed GetUpgradeForSpecificCurrencyGoal not setting current progression on activate.

## Version 0.6.36, 2018-05-23

* *BUGFIX* Fixed issue where unrelated modifiers could be applied to the wrong modifiable.
* *CHANGE* ^RELATED: The logic for this fix is hacked into Economy.GetModifierDatasAffectingId(string modifiableId, string category). Modifiers will likely be refactored in the future and this issue should definitely be addressed.

## Version 0.6.35, 2018-05-23

* *BUGFIX* Fixed getter that returned itself in GetCustomersForBusinessesGoalData.

## Version 0.6.34, 2018-05-22

* *BUGFIX* Fixed issue Businesses would enter state prematurely and crash when Modifiers were queried.

## Version 0.6.33, 2018-05-22

* *BUGFIX* Fixed issue where goals wouldn't fetch saved data when initialized.
* *BUGFIX* Fixed issue where modifiers could be applied regardless of modifierCategory.

## Version 0.6.31, 2018-05-22

* *BUGFIX* Fixed issue where season modifier datas would be copied with null data and skip application to modifiables.
* *CHANGE* ^RELATED: SeasonData object not longer caches modifier datas from its business season datas. Not ideal and should be updated in the future, but was integral to the above bugfix.
* *CHANGE* GoalSequenceSavedData cannot go past its target progression.

## Version 0.6.30, 2018-05-20

* *CHANGE* Made DifficultyManager increment Season starting currency.

## Version 0.6.29, 2018-05-20

* *BUGFIX* Fixed DifficultyManager issue in UpdateGlobalModifier.
* *BUGFIX* Additives now cause business speed to go lower not higher.
* *BUGFIX* Fixed divide by 0 in multiplicative business speeds.

## Version 0.6.28, 2018-05-18

* *BUGFIX* Fixed non virtual methods in Content.

## Version 0.6.27, 2018-05-16

* *BUGFIX* Typo fixed missed in requirement naming.

## Version 0.6.26, 2018-05-16

* *BUGFIX* Fixed the ordering of the Modifiers so that additive always comes first.
* *BUGFIX* Fixed issue where locked currencies could apply modifiers.

## Version 0.6.25, 2018-05-16

* *BUGFIX* Fixed the normalizedProgression for AutomateSpecificBusinessGoal and BuySpecificBusinessGoal.

## Version 0.6.24, 2018-05-16

* *BUGFIX* Rename business difficulty variables to match BE implementation.

## Version 0.6.23, 2018-05-15

* *BUGFIX* Fixed a bad conditional in automation character requirements.

## Version 0.6.22, 2018-05-14

* *CHANGE* Made ModifierDatas that affect Business speed apply their changes with division rather than multiplication if they are multiplicative.

## Version 0.6.21, 2018-05-14

* *BUGFIX* Fixed issue where GuidReferenceHelper would infinitely refresh guids if they were imported on the same frame as a refresh. Fix was simply a removal of auto refreshing during new asset import .

## Version 0.6.20, 2018-05-12

* *CHANGE* Made public methods in Content and RewardManager virtual.

## Version 0.6.19, 2018-05-12

* *CHANGE* Removed all timer gacha references.

## Version 0.6.18, 2018-05-12

* *ADDED* Introduce difficulty manager to handle playthroughs scaling difficulty.
* *CHANGE* Pre-Process business cost data before feeding it to the views.

## Version 0.6.17, 2018-05-11

* *BUGFIX* Fixed CollectFromBusiness actions not logging correct time.

## Version 0.6.16, 2018-05-10

* *BUGFIX* Fixed Ascension and looping episodes unit tests.

## Version 0.6.15, 2018-05-09

* *CHANGE* Optional UpgradeableCurrencyRequirements for buying a business added to BusinessBalanceData.

## Version 0.6.14, 2018-05-09

* *CHANGE* Business saved data now saves in Unix milliseconds, not 'ticks' which could vary between frontend/backend.
* *ADDED* "TimeUtils.unixZero".

## Version 0.6.13, 2018-05-08

* *FIX* Resolved potential collision between GuidReferenceHelper and CoreGuidReferenceHelper due to outdated reflection.
* *CHANGE* Added GuidReferenceUtility support for GetName overload that only takes an Id with no Type.

## Version 0.6.12, 2018-05-08

* *CHANGE* Added logic to check character requirements when automating a Business.
* *CHANGE* Created UpgradeableCurrencyRequirement to track Upgradeablecurrency level requirements.

## Version 0.6.11, 2018-05-07

* *CHANGE* Added isUnlocked to UpgradeableCurrencySavedData which gets flagged upon the first time setting the saved data amount.

## Version 0.6.10, 2018-05-04

* *FIX* Gacha save key content specific.

## Version 0.6.9, 2018-05-04

* *FIX* Gacha save key spelled correctly.

## Version 0.6.8, 2018-05-03

* *FIX* Fixed DynamicCollectCurrencyTests, which broke due to the GoalCreateAction never being called.
* *FIX* Fixed BusinessTests, which broke due to our DummyTimerService not having any functionality.

## Version 0.6.7, 2018-05-03

* *CHANGE* Looping episodes.

## Version 0.6.6, 2018-05-02

* *FIX* _timerGachaLastOpenedTime now has saved data.
* *CHANGE* All acitons now utilize milliseconds timestamp instead of seconds (previously had too little granularity for validation).

## Version 0.6.5, 2018-05-01

* *FIX* _isContentSpecific was missing a [SerializeField] on GachaRewardData.cs.
* *FIX* Fixed all Currency unit tests, which also allowed the logic for Currencies being able to add/remove negative values.

## Version 0.6.4, 2018-05-01

* *CHANGE* Added isUnlocked to BusinessSavedData and implemented it in BuyBusinessAction.

## Version 0.6.3, 2018-05-01

* *CHANGE* Removed dependencies that were accidentally reintroduced.

## Version 0.6.2, 2018-05-01

* *CHANGE* Updated tests to use new Contentdata constructor.

## Version 0.6.1, 2018-05-01

* *CHANGE* Added hasStarted flag to ContentSavedData to help award starting currencies when a Content is started.
* *CHANGE* Added CurrencyAmount class to wrap simple currencyId / amount pairs.
* *CHANGE* Added startingCurrencyAmounts to ContentData.
* *CHANGE* Changed BeginContentAction to make use of the new startingCurrencyAmounts.

## Version 0.6.0, 2018-04-23

* *CHANGE* Changed BusinessSavedData ascension behaviour to delete keys instead of resetting to default values.
* *CHANGE* Added next level GetPayout and GetSpeed functionality to Economy.
* *CHANGE* Added functionality to Business State classes to react to upgrading the business.

## Version 0.5.6, 2018-04-11

* *CHANGE* Removed dependency to "EastSideGames.Core".

## Version 0.5.5, 2018-04-11

* *CHANGE* Removed dependency to "EastSideGames.Services.Time".
* *FIX* Renamed incorrect Create Asset menu entry for CurrencyReward.

## Version 0.5.4, 2018-04-10

* *CHANGE* Added GetModifiersAffectingModifiable and other getters to Economy.

## Version 0.5.3, 2018-04-10

* *CHANGE* Updated all IKeyValueGameSave objects to include a GetIterator and GetSortedIterator for key/value save pairs.

## Version 0.5.2, 2018-03-29

* *CHANGE* Removing actions/static data that require backend. Added Gacha.

## Version 0.5.1, 2018-03-27

* *CHANGE* Removed dependency to "EastSideGames.Services.GameSave".

## Version 0.5.0, 2018-03-23

* Initial version.
