# Upgrade Notes

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

### idlekit-ioc
* N/A

### idlekit-framework
##### Base Collector
* `IBaseCollectorBalanceData.basePayout` has been changed to `basePayoutAmount` due to the introduction of `IPayoutEntity` that could be either `ICurrency` or `IReward`.
* `IBaseCollectorBalanceData.payoutCurrencyId` has been changed to `payoutEntityId` due to the introduction of `IPayoutEntity`that could be either `ICurrency` or `IReward`.
* `IBaseCollectorEntity.payout` has been renamed to `IBaseCollectorEntity.payoutAmount` due to the rename of `IBaseCollectorBalanceData.payoutCurrencyId` to `IBaseCollectorBalanceData.payoutEntityId`.
* `IBaseCollectorEntity.GetPayout(bool, IModifier[])` has been renamed to `IBaseCollectorEntity.GetPayoutAmount(bool, IModifier[])` due to the rename of `IBaseCollectorBalanceData.payoutCurrencyId` to `IBaseCollectorBalanceData.payoutEntityId`.

##### Generator
* `IGeneratorEntity.payoutCurrencyPerMillisecond` has been changed to `IGeneratorEntity.payoutAmountPerMillisecond` due to the introduction of `IPayoutEntity`.

##### Random
* `IRandomService.InitializeRandom` has been deprecated use `InitializeRandom(int)` with `int GetRandomSeed()` to obtain a random seed.

##### Reward
* `IReward.CalculateRewards(int)` has been changed to `IPayoutEntity.CalculatePayouts()` since now `IRewards` implements `IPayoutEntity`.
* User should set the seed using the `IRandomService.InitializeRandom(int)` first before calling `CalculatePayout()`.

### idlekit-implementation
##### State Action
* `GrantRewardStateAction.rewardResults` has been renamed to `GrantPayoutsStateAction.payoutResults` due to the introduction of `IPayoutEntity`.

### idlekit-tools
* N/A

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

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

### idlekit-ioc
* N/A

### idlekit-framework

##### Economy Service
* `IEconomyService.GetPayout(IBaseCollectorEntity baseCollectorEntity)` has been deprecated, use `IBaseCollectorEntity.GetPayout()` instead.
* `IEconomyService.GetPayout(IBaseCollectorEntity baseCollectorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IBaseCollectorEntity.GetPayout(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* `IEconomyService.GetDuration(IBaseCollectorEntity baseCollectorEntity)` has been deprecated, use `IBaseCollectorEntity.GetDuration()` instead.
* `IEconomyService.GetDuration(IBaseCollectorEntity baseCollectorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IBaseCollectorEntity.GetDuration(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* `IEconomyService.GetAffordableUnitsToNextTarget(IGeneratorEntity generatorEntity, bool applyModifiers, IModifier[] excludedModifiers = null)` has been deprecated, use `IGeneratorEntity.GetAffordableUnitsToNextTarget(bool applyModifiers, IModifier[] excludedModifiers = null)` instead.
* `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.
* `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
* `IEventContentSavedData` and `IStandardEventContentSavedData` have been removed along its tracking of `milestoneIndex`.
    * Use the `IContent.contentSavedData` to access content saved data information on `IEventContent`.
    * Use the `IEventContent.GetCurrentMilestone()` to access the current `IMilestone`.
    * Use the newly added `IEventContent.GetCurrentMilestoneIndex()` to replicate the previous `milestoneIndex` functionality.

##### Event Settings
* `IEventSettings.CanCompleteMilestone(string);` has been changed to `IEventSettings.CanCompleteMilestone(IMilestone);` as the method implicates that the `IMilestone` in parameter should be loaded.
* `IEventSettings.SetMilestoneCompletionTime(string, long);` has been changed to `IEventSettings.SetMilestoneCompletionTime(IMilestone, long);` as the method implicates that the `IMilestone` in parameter should be loaded.
* `IEventSettingsSavedData.CompleteMilestone(string,long);` has been changed to `IEventSettingsSavedData.SetMilestoneCompletionTime(string, long, bool);`.

##### Generator Entity
* `GeneratorStateType` enum has been converted into a static class that contains constant `state string`. This is done so new `string` state type can be added easily.
* `GeneratorStateType generatorStateType { get; }` has been changed to `string generatorStateType { get; }` due to the change to `GeneratorStateType`.
* `IGeneratorEntity.ChangeState(GeneratorStateType)` has been changed to `IGeneratorEntity.ChangeState<TGeneratorState>()` using the type of the `IGeneratorState` has the generic function parameter.
* `IGeneratorEntity.Collect(long count=1)` now returns `bool` instead of `void`. Any overriding implementations will need to be updated accordingly.

##### Generator State
* `IGeneratorState.Enter(IGeneratorState)` has been changed to `IGeneratorState.Enter(IGeneratorEntity, IGeneratorState)` to fully implement the state (strategy) pattern and work with the container. 

##### Milestone Completion
* `MilestoneCompletionInfo.completionTime` has been changed to `MilestoneCompletionInfo.projectedCompletionTime` to denote the fact the value can be changed by projection or actual completions.

##### Timer Subscription
* `bool hasInitialTime` has been changed to `bool hasStartTime` to coincide with the usage of `endTime`.
* `DateTime initialTime` has been changed to `DateTime startTime` to coincide with the usage of `endTime`.
* `long initialTimestamp` has been changed to `long startTimestamp` to coincide with the usage of `endTime`.

### idlekit-implementation
##### Action
* `CompleteMilestoneStateAction` has been deprecated as `IEventContent` no longer keeps track fo the current `milestoneIndex`. Call `IEventSettings.SetMilestoneCompletionTime(IMilestone, long)` to set the `MilestoneCompletionInfo`.
* `SetProjectedMilestoneCompletionStateAction` has been renamed to `SetMilestoneCompletionInfoStateAction`. It is now called from `IEventSettings.SetMilestoneCompletionTime(IMilestone, long)` to project completion of the `IMilestone` or actually complete the `Milestone`.
* The `ClearContentStateAction` has been renamed `ClearContentIdStateAction` and a new `ClearContentAction` has been added. Any game code listening to the previous `ClearContentStateAction` will need to be updated to one of these two new actions. Which action to listen to depends on the desired behaviour:
  * `ClearContentIdStateAction` is called at the end of the process of wiping down `IContent` and `IContentData` when switching content. It is not called when `Startup.ResetGame` is called.
  * `ClearContentAction` is called when the `IContent` entity is unloaded. Most game code/UI code that is interested in the `IContent` should now listen to this event. It is called when switching content and when `Startup.ResetGame` is called. 

##### Generator Entity
* The `EventContent` constructor now takes a `string[] collectorEntityIds` as a parameter. Any extending implementations will need to have their constructors updated accordingly.
* `GeneratorEntity.Collect(long count=1)` now returns `bool` instead of `void`. Any overriding implementations will need to be updated accordingly.
* The `GeneratorEvent` has been removed. Use any of the following events instead:
  * `GeneratorInitializedEvent`
  * `GeneratorPayoutChangedEvent`
  * `GeneratorStateChangedEvent`
  * `GeneratorSpeedChangedEvent`

##### Startup
* The `Startup.ResetGame` flow now does not result in the `IUserSavedData.contentInstanceId` being wiped. This means when the app is restarted via this flow, the player will re-enter the `IContent` previously loaded. To retain the previous behaviour where `ResetGame` resulted in always loading into main game Content, the `Startup.SetClearContentLoadPhases` method can be overridden to always queue the `IClearContentIdLoadPhase`.
  
##### Standard Content
* The `StandardContentData` and `StandardEventContentData` constructors now takes a `string[] collectorEntityIds` as a parameter. Any extending implementations will need to have their constructors updated accordingly.

### idlekit-tools
##### Simple Entities Database
* The grouping of data in the `SimpleEntitiesDatabase` has been updated to reflect how data is grouped in the IdleKit CSVs. Old `SimpleEntitiesDatabase` assets will have to be updated since references will be lost. The affected fields are as follows:
    * `Reward Data` has been split into `Ascension Reward Data` and `Currency Reward Data`
    * `Tag Data` and `Rarity Data` has been combined into `Tag Data`

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

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

### idlekit-ioc
* N/A

### idlekit-framework
##### Event Settings
* `eventDuration` has been removed from `EventSettingsData`. Please set event end time (and duration effectively) using `EventSettings.SetEventEndTime(long timestamp)`. It is recommended that this is called via a backend command, similar to `EventSettings.StartEvent()` and `EventSettings.EndEvent()`. If this is not preferred, the duration can be set using a default value from a UI prefab - see `CanvasEventView.cs` for an example.

##### Goal
* Any `IGoal` implementations must now implement a `Reset()` method. This method should deactivate the `IGoal` and reset it's saved data.
* `Goal.Deactivate()` no longer resets the saved data for a `IGoal`. If you are calling `Deactive()` directly from game-code, the previous behaviour can be retained by calling the new `Goal.Reset()` method.
* `Goal.canClaim` now checks if `targetProgression` has been set, so `Goal.canClaim` returns false if the goal has not been activated.

##### Milestone
* Any `IMilestone` implementations must now implement a `Activate()` method, which overloads the existing `Activate(double initialProgress)` method.
* `IMilestoneSavedData` implementations must now implement `isActive`, `Activate()`, and `Deactivate()`.

##### Standard Content
* `IStandardContent.HasValidActiveTrade()` has been deprecated, use getter `IStandardContent.standardContentFeatures.activeTrade` to get the active `ITrade` to see if it is null.
* `IStandardContent.ActivateTrade()` has been deprecated, use `IStandardContent.RefreshTrade()` to activate a new valid `ITrade`.
* `IStandardContentSavedData.InitializeTradeTimer(long)` has been deprecated, use `IStandardContentSavedData.Deactivate(long)` to set the `IStandardContentSavedData.lastActiveTradeDeactivationTime`.

### idlekit-implementation
##### Action
* `TradeActivatedAction` and `TradeDeactivatedAction` have been deprecated, subscribe to `ToggleActiveTradeStateAction` and use the property `bool activated {get;}` to see if the `ITrade` is activated or deactivated.

##### PlotPoint Runtime
* `IPlotPointSequenceData IPlotPointController.sequence { get; }` has been renamed `IPlotPointSequenceData activeSequence { get; }`.
* `bool IPlotPointController.canPlay` has been removed from the interface use `bool IPlotPointController.isPlaying` or the concrete implementation `PlotPointController.canPlay`.

##### PlotPoint Activation
* `MilestoneCompletedActivationCondition.ctor(string, string)` has been changed to `MilestoneCompletedActivationCondition(string)`.

##### Reward
* `IGachaItem`s and `IRandomWeighted` items with 0 weight will no longer be chosen as part of a `GachaReward`.

##### Standard Content and Standard Event Content
* `StandardContent.timerSubscription`, `StandardContent.UpgradeProgression` and `StandardContent,OnTimerEnded` have been deprecated. They were moved to `StandardContentFeatures.timerSubscription`, `StandardContentFeatures.UpgradeProgression` and `StandardContentFeatures.OnTimerEnded`. Call `IStandardContent.standardContentFeatures` to access the functions.
* `StandardEventContent.timerSubscription`, `StandardEventContent.UpgradeProgression` and `StandardEventContent,OnTimerEnded` also require the same upgrades as `StandardContent`.

### idlekit-tools
##### LoadPhase
* `CanvasInitializeUILoadPhase.Initialize(CanvasContentView)` has been changed to `Initialize(CanvasUI)` to be consistent with `CanvasCleanupUILoadPhase.Initialize(CanvasUI)`.

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

## Version 1.1.0 to 1.1.1, 2020-06-01
### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
* N/A

### idlekit-implementation
* N/A

### idlekit-tools
* N/A

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

## Version 1.0.1 to 1.1.0, 2020-05-25
### idlekit-logging
* N/A

### idlekit-ioc
* N/A

### idlekit-framework
##### Action
* `dispatchAs` is deprecated. Use `typesToDispatchAs` instead.

##### Data Loader
* `void LoadData(IStaticData data, bool contentSpecific = true)` is deprecated. Use `void LoadData(IStaticData data)` instead.
* `void LoadData(IStaticData[] data, bool contentSpecific = true)` is deprecated. Use `void LoadData(IStaticData[] data)` instead.

##### Event Settings
* `IEventSettings.CompleteMilestone` has been removed as it manipulated saved data directly. This functionality can be performed via the `CompleteMilestoneStateAction` instead.

##### Load Phase
* `IContentDataLoadPhase.Initialize(string, Func<string, IStaticData[]>)` is deprecated. Use `IContentDataLoadPhase.Initialize(Func<string, IStaticData[]>)` instead as the `contentInstanceId` is loaded from the `IUserSavedData` instead of being passed in.
* `ILoadContentLoadPhase.Initialize(string)` is deprecated. The `contentInstanceId` is loaded from the `IUserSavedData` instead of being passed in.

##### Startup
* `void StartGame(IContext)` has been changed to `void StartGame()`.
* Starting from version 1.1.0,  if the player was going to start the game in an expired/complete EventContent, the game would now start the player in the MainGame. Override the implementation in `SetContentIdLoadPhase` to retain the old behaviour.

##### Timer Listener
* `void OnTimerEnd(int count)` has been changed to `void OnTimerEnd(long count)` to support a larger number of collections. Any classes that implement `ITimerListener.OnTimerEnd` will need to be updated accordingly.

### idlekit-implementation
##### Action
* `StaticDataAddedAction` and `StaticDataRemovedAction` have had `bool contentSpecific { get; set; }` removed as content specific is only a concept related to the `ISavedDataProvider`. However, you can still get the information from the `IStaticData[] data` if they can be casted to `ISavedDataProviders`.
* `dispatchAs` is deprecated. Use `typesToDispatchAs` instead. All actions and state actions will have to be updated to reflect this change.
* Passing a null instance to `ActionService.Unsubscribe` will now result in a warning being generated. If you were doing this previously, null check the instance before calling `Unsubscribe`.

##### Event Settings
* `EventSettings.CompleteMilestone` has been removed as it manipulated saved data directly. This functionality can be performed via the `CompleteMilestoneStateAction` instead.

### idlekit-tools
* N/A

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

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

### idlekit-ioc
* N/A

### idlekit-framework
* N/A

### idlekit-implementation
* N/A

### idlekit-tools
* N/A

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

## Version 0.20.8 to 1.0.0, 2020-03-10
### idlekit-framework
##### Action
* All `IEvent`s have been renamed to `IAction`s.
* All `IPlayerEvent`s have been renamed to `IStateAction`s.
* `IPooledEvent` has been removed as pooling is done in the dependency container. Subsequently, `IPooledEvent.OnReturnToPool()`has been renamed to `IAction.ResetEvent()`.
*  All `IActions` have been refactored to work with dependency injection and implement `IInjectable`.

##### Action Service
* `IEventService` has been renamed to `IActionService`.
* If you were subscribing with a null instance, using `IEventService.Subscribe<T>(handler, instance)`, the request to subscribe will now fail whereas previously the subscription was unintentionally added to the global list. Use `IEventService.Subscribe<T>(handler)` to subscribe globally or pass a non-null instance to the original subscription call to subscribe to that instance only.

##### Character
* All classes related to `ICharacter`, `ICharacterData`, `ICharacterSavedData` and `ICharacterDataAsset` have been removed. `IGeneratorEntity` and `IGeneratorData` had references to the above interfaces removed. The same functionality can be achieved by using `ModifierService.GetModifiersAffectingModifiable()` and `ModifierService.GetModifiablesAffectedByModifier()`.

##### Content
* `IContent.BeginStage()` is removed and merged into `IContent.Initialize()`, which is executed when the `IContent` gets loaded by the `IEntityLoader`.
* `IContent.EndStage()` is no longer public and an interface method as its functionality is now inside the `IContent.AdvanceStage()` or `IContent.Cleanup(IEntityLoader)` methods.
* `IContentData.startingCurrencyAmounts` and their overrides have been renamed to `IContentData.initialCurrencyAmounts` in all places in the codebase.
* In `IStandardContent` and `IStandardContentData`, `missingResourcesExchangeRateMultiplier` has been split into `softCurrencyMissingResourcesMultiplier` and `upgradeableCurrencyMissingResourcesMultiplier`

##### Currency Service
* This service was renamed from `ICurrencyManager` to `ICurrencyService`.
* `T[] GetAllCurrencies<T>(Predicate<T>)` has been removed. Use `IResolver.ResolveAll<TContract>(Predicate<TContract>)` instead.
* `IUpgradeableCurrencyManager` has been removed. Use the generic `ICurrencyService.GetAllCurrencies<T>()` method instead.
* `ICurrencyService.ValidateAddCurrencyAmount(string id, double amount)` and `ICurrencyService.ValidateRemoveCurrencyAmount(string id, double amount)` have been removed. This was done to remove unused methods from the `ICurrencyService` interface. If your project used these methods you will need to extend `ICurrencyService` and re-implement them.

##### Dependency Container
* `IDependencyContainer` and `DependencyContainer` has been renamed to `IContainer` and `Container` that implements the `IResolver` and `IBinder`. Refer to the documentation site for more information.
* `IContext` and `Context` have been refitted to contain the new `IContaienr` and `IInstaller`, which is now the location of all the binding information.
*  Binding with the new `IDependencyContainer` is now located in `IInstaller` and its implementations.

##### Entity
*  All `IEntity` have been refactored to work with dependency injection and implement `IInjectable`.
* `IEntityController` has been renamed to `IEntity`.
* `IEntityData.Create<T>(IDependencyContainer)` has been change to `IEntityData.CreateEntity(string)` so the entity created only takes in `instanceId` and `staticDataId` and have its other dependency injected.
* `ISavedDataProvider.CreateSavedData(string, IDependencyContainer)` has been changed to `ISavedDataProvider.CreateSavedData(string)` due to the introduction of the dependency container.
* `IStaticData.isContentSpecific` is moved to `ISavedDataProvider` as it affects the way saved data being saved.
* `IEntity`, `IEntityData`, and `ISavedData` all have minimal constructors as the dependencies are now injected in `Injectable.Inject` instead.
*  Now an `IEntity` is created with the `ctor(string, string)`, `Injected(IResolver)` with all the dependencies, setup with `Initialize()`, and cleaned up with `Cleanup(IEntityLoader)`. Please refer to the `Understanding Entities` page in the manual section of the documentation website.
* `IEntity.Initialize` method is introduced that means all implementation would require to implement `void Initialize()`.
* `IEntity.Cleanup` is now required to be implement if the `IEntity` holds any reference - loading any sub `IEntities` (i.e: `IStage` loading all `IGenerators`. Therefore those `IGenerators` need to be unloaded with `loader.UnloadEntity(generators)`), or obtain object references (i.e: `IStage` holding reference of `IStageData`).
* `IEntityCache` is now deprecated and replaced by the dependency container.
* `ILoaderService` has been renamed to `IEntityLoader` as it no longer stores the references of the loaded `IEntities`.
* `IStaticDataManager` has been renamed to `IStaticDataLoader` as it no longer stores the reference of the loaded `IStaticData`.
* All `IEntityDataAsset` classes now need to pass a generic data Type through to a base `IGuidReferencable<T>`.

##### Event
* `IEvent`s and all related classes have been renamed to `IAction`s.

##### Event Content Service
* `IEventContentService` has been renamed to `IEventService`. Note that what used to be `IEventService` is now named `IActionService`.

##### Event Service
* `IEventContentService` has been renamed to `IEventService`. Note that what used to be `IEventService` is now named `IActionService`.
* `IEventService.RegisterEventSettings(IEventSettings[])` and `IEventService.RegisterEventSetting(IEventSetting)` have been deprecated as `IEventSettings` are now cached in the `IContainer`.
* `bool CanClaimRewards(string)` and `void ClaimRewards(string)` have been removed from the `IEventService`. Use `IEventSettings.CanClaimRewards(string)` and `IEventSettings.ClaimRewards(string)` directly on the associated `IEventSettings` instead.

##### Generator
* The following fields have moved from `IGeneratorBalanceData` to `IGeneratorEntityData`. All implementations and references of these fields will need to be updated accordingly, and all `IGeneratorBalanceDataAsset`s and `IGeneratorEntityDataAsset`s will need to be regenerated.
    * `costToBuy`
    * `buyCurrencyId`
    * `upgradeableCurrencyBuyRequirements`
    * `costToAutomate`
    * `automateCurrencyId`
    * `upgradeableCurrencyAutomationRequirements`

##### Goal
* `IGoal.normalizedProgress` and `IGoalSavedData.normalizedProgress` now return a double instead of a float

##### Logging
* All Logging related classes and interfaces including `IdleKitLog` have been moved into a separate repository at `git@github.com/Idlekit/idlekit-logging.git` and different namespace under `IdleKit.Logging`. Users utilizing the Unity Package Manager should include `"com.idlekit.idlekit-logging": "ssh://git@github.com/Idlekit/idlekit-logging.git"` as part of the `dependencies`.

##### Milestone
* `IMilestoneData.rewardId` has been removed. The reward Id for a `Milestone` can instead be found via `IEventSettingsData.GetMappedRewardId(IMilestoneData.id)`. However in a production title, a display name would usually be located in the game's view data for the Milestone.
* `IMilestoneSavedData.progress` has been renamed to `IMilestoneSavedData.progression` for consistency with `IGoalSavedData.progression`.
* `IMilestone.normalizedProgress` now returns a double instead of a float

##### Modifiers
* `ModifierSearchResult` has been removed and its functionality is now handled by `IModifierGroupData` and `IModifierFormula`. All usages of this class must be updated accordingly.
    * Added `IModifierFormula`, `IModifierFormulaData`, `IModifierFormulaDataAsset`, and `IModifierFormulaParser`
    * `IModifierCategoryData` and `IModifierCategoryDataAsset` have been renamed to `IModifierGroupData` and `IModifierGroupDataAsset`.
    * Methods in `IModifierCache` and `IModifierService` that used to use `IModifierCategoryData` types now use `IModifierFormula` types.
    * `IModifierData.Initialize(IModifierCategoryData modifierCategoryData)` has been removed since it no longer keeps a reference to `ModifierCategoryData`.`IModifierData.priority` has also been removed since the new `IModifierFormula` handles priority implicitly.

##### Namespaces
* The following namespaces within `idlekit-framework` have been changed. Any game code referencing these will need to be updated.
    * `IdleKit` to `IdleKit.Framework`
	* `IdleKit.PlotPoint` to `IdleKit.Framework`
	
##### PlotPoint
* All classes that implemented `IPlotPointDataAsset` have been converted to implement `IPlotPointDataAsset<T> where T : IPlotPointData` instead so their `data` can be of the derived type instead of the base `IPlotPointData`.
* `IPlotPointActivationCondition` has been incorporated into the `IContainer` and became `IInjectable` therefore the previous `IPlotPointActivationCondition.Start` method has been eliminated.
* `IPlotPointActivatorData.Start` and `IPlotPointActivatorData.Cleanup` have been removed as the `IPlotPointService` is now in charge of creating and injecting the `IPlotPointActivationCondition`.
* `IPlotPointSequenceCollectionData.StartActivators` and `IPlotPointSequenceCollectionData.Cleanup` have been removed as it is now a pure data class. The functionality is moved into `IPlotPointService`.
* `IPlotPointService.QueueSequence` has been refactor to. Invoke `IPlotPointService.ActivatePlotPoint(IPlotPointActivationCondition)` directly instead.
* `IPlotPointService.hasQueuedSequences` has been removed. Perform a null check on `IPlotPointController.sequence` instead.
* `IPlotPointService.GetNextSequence` has been removed. As the `PlotPointSequenceData` can be triggered in arbitrary order.
* `IPlotPointController.frames` and `IPlotPointController.actions` have been removed. You can get the same information from `IPlotPointController.sequence` to get the `IPlotPointSequenceData` which contains the `frames` and `actions` information.
* `IPlotPointController.currentActionIndex` has been removed. However, it is still available in the `PlotPointController` concrete class.
* `IPlotPointController.isPaused` has been removed. Use `IPlotPointController.canPlay` instead.

##### Reward
* `ITimedRewardSavedData` has been refactored to be consistent with other timed related `ISavedData`.
    * `long timedCompleted { get; }` was replaced by `long timedStarted { get; }`. The start time of the timedReward can still be found by checking `ITimedReward.timerSubscription.initialtimestamp`.
    * `bool neverClaimed { get; }` was replaced by `bool hasStarted { get; }`, which is a a better indication if `ITimedRewardData.duration` or `ITimedRewardData.initialDuration` should be used.
* `RandomTagsCurrencyReward` has been renamed to `RandomObtainedCurrencyReward`. The `allowUnobtained` option in the data has also been removed. This changes the behaviour of this reward. There is now no support to reward from a pool of both obtained and unobtained currencies. Instead you must be explicit about the kind of currency you want to reward. If you need to reward an unobtained currency, use a `RandomUnobtainedCurrencyReward`, `CurrencyUnlockReward` or `CurrencyReward` instead. To reward an obtained currency, you can use `RandomObtainedCurrencyReward`, `CurrencyUnlockReward` or `CurrencyReward`.
* Any custom implementations of `IReward` must now support the `ignoreFallback` argument in their `CanClaim` method. The same argument must be implemented in any custom implementations of `IGachaReward.GetValidItems`.

##### Service
* `IService.Load(Action<IService>)` has been renamed to `IService.Initialize(Action<IService>)` following the new `Inject -> Initialize -> Cleanup` loading paradigm. Please refer to the documentation site for more information.
* All `IServices` have been refactored to work with dependency injection and implement `IInjectable`.
* Renamed the following Service interfaces to better fit naming conventions. Any custom implementations of these Services will need to be updated.
    * `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 `IStaticDataLoaderService`

##### Stage
* `IStageData.startCurrencyId` and `IStageData.startCurrencyAmount` have been deprecated. Use `IStageData.startingCurrencyAmounts` instead.

##### Time Service
* The following functions have been renamed:
    * `DateTime now { get; }` was renamed to `DateTime gameTime { get; }`
    * `long timestamp { get; }` was renamed to `long gameTimestamp { get; }`
    * `void SetTime(long)` was renamed to `void SetGameTimestamp(long)`
* All the time related functionality in the game should still interact with `gameTime`. The newly added `DateTime systemTime` can be overridden by the user so an official time value can be provided from a backend.

##### Trade Service
* The method `GetRandomValidTrade` has been moved out of the UI and added to the `ITradeService`. Any UI elements getting a random valid trade should now call `ITradeService.GetRandomValidTradeFromPool()` and pass in an array of `ITrade`s or an array of `ITrade` string IDs.

##### Unlockable
* The `IUnlockable` interface now requires that `SetAvailability` and `SetObtained` methods now be implemented. These should set the `available` and `obtained` flags respectively.
* The `IUnlockableSavedData` interface now requires that `SetObtained` method be implemented. This should set the `obtained` flag.
* The `IUnlockableData` has been removed. To make a `Currency` `available` by default when a `Content` or `Stage` starts, use the `Content.initialCurrencyAmounts` or `Stage.availableCurrencyIds`.

### idlekit-implementation
##### Action
* `Event`s have been renamed to `Action`s.
* `PlayerEvent`s have been renamed to `StateAction`s.
* `EventPools` have been removed in `IActionManager`. It now uses the container to pool and cache the `IAction`s.
* `StageSelectedAction` has been removed as it has never been used. Entities should subscribe to `StageInitializedAction` or `ContentInitializedAction` instead.
* The order of firing of `ContentInitializedAction` >>> `StageInitializedAction` has been reversed. The current order now is `SetContentStateAction` >>> `StageInitializedAction` >>> `ContentInitializedAction`.
* Actions surrounding Generator unit targets have been refactored. Saving the final unit target hit and the reward logic was moved from `IncrementGeneratorUnitStateAction` to the new `GeneratorUnitTargetHitStateAction`. If you need access to the final unit target in the saved data or the reward information you will need to listen to the new action.
* `OpenTimerTrunkStateAction` has been removed. Use `ClaimTimedRewardStateAction` instead.
* Goal and Generator data are now cleared at a later point when ascending. This allows for a more flexible UI flow.
* `OfflineProgressAction` has been renamed to `OfflineProgressStartAction` in order to maintain consistency with the new `OfflineProgressEndAction`. References to this action will need to be updated.
* `IdleKitInitialized` event must now be initialized with a valid `IContent`.
* `EventStartedEvent` and `EventEndedEvent` are now `IStateAction`s and have been renamed `EventStartedStateAction` and `EventEndedStateAction`.
* `AdvanceStageStateAction` will no longer set the `ContentSavedData.currentStageId` to null when `Content.nextStageId` is null. Instead, the previous `currentStageId` will be retained. This means on ascending the final `IStage` within the content, the `IStage` will not change, whereas previously the first `IStage` of the Content would be loaded. See `CanvasAscendView` in `idlekit-tools` as an example of how to present this to the player or the Looping Content example in `idlekit-examples` if you want Stages to loop.

##### Boost
* The `_modifierDatas` field in `BoostData` has been renamed to `_boostModifierDatas`.
* The `_duration` & `_maxDuration` fields in `TimedBoostData` have been renamed to `_durationInSeconds` and `_maxDurationInSeconds`. The `TimedBoostData` constructor has been updated to match.
* The `duration` and `maxDuration` properties in `TimedBoostData` now represent milliseconds rather than seconds. Any client code using these values must be updated accordingly.

##### Content
* We no longer use `IContentSavedData.timeModified` to store user's last activity time as it is done now in `IUserSavedData.SetLastActivityTime(long)`
* `ContentData.isContentSpecific` has been set to `true` from `false`. This change will result in the filename of the serialized `ContentSavedData` to be changed.
* In `StandardContent`, `StandardContentData`,`StandardEventContent`, and `StandardEventContentData`, `missingResourcesExchangeRateMultiplier` has been split into `softCurrencyMissingResourcesMultiplier` and `upgradeableCurrencyMissingResourcesMultiplier`
* In `StandardContentData` and `StandardEventContentData` constructors, `missingResourcesExchangeRateMultiplierId` is replaced `softCurrencyMissingResourcesMultiplierId` and `upgradeableCurrencyMissingResourcesMultiplierId`

##### Core
* All `IEntity`, `IAction`, and `IService` implementations have been refactored to work with dependency injection and implement `IInjectable`.

##### Currency Service
* This service was renamed from `CurrencyManager` to `CurrencyService`.
* All `ValidateCurrency` logic has been removed as they are just empty. Override `CurrencyService` if you wish to perform validation logic.

##### Entity Data
* All `IEntityData` have the dependency resolving logic (in method `IEntityData.Create<T>`) using the previous `IDependencyContainer` removed. They are now being resolved in `IEntity.Resolve(IResolver)`.
* All `EntityParameters` classes that were previously being passed in the constructors of all `IEntity` have been removed due to the introduction of the dependency container.

##### Entities Database
* `void AddStaticData<TStaticData>(ScriptableObject[])` has been renamed to `TStaticData[] FetchStaticData<TStaticData>(ScriptableObject[])`.
* `EntitiesDatabase` has been renamed `SimpleEntitiesDatabase` and moved into `idlekit-tools`. Reimporting balance data will generate an updated database.
* `PlotPointDatabase` has been renamed `SimplePlotPointDatabase` and moved into `idlekit-tools`.

##### Events
* `Event`s have been renamed to `Action`s.
* `PlayerEvent`s have been renamed to `StateAction`s.

##### Event Service
* `EventContentService` has been renamed to `EventService`. Note that what used to be `EventService` is now named `ActionService`.

##### Goal
* The abstract class `MakeTradeGoal` now subscribes to a `TradeAcceptedAction` instead of a `MakeExchangeAction`. All implementations will need to be updated accordingly.
* `Goal.normalizedProgress` and `GoalSavedData.normalizedProgress` now return a double instead of a float

##### JsonSerializer
* The `JsonSerializer` has been renamed `SimpleJsonSerializer`.

##### Main
* `Main` has been completely refactored and moved to `idlekit-tools`. It is now an abstract class that implements one potential way of providing static data to the new startup flow. Any extensions of `Main` will need to be changed to work with the new startup flow. Refer to the documentation website for more information.
* `Main.content` has been removed as it is now being fetched from the `IContainer` with `_container.Resolve<IContent>(userSavedData.contentId)`.

##### Milestone
* `MilestoneData.rewardId` has been removed. The reward Id for a `Milestone` can instead be found via `IEventSettingsData.GetMappedRewardId(IMilestoneData.id)`. However in a production title, a display name would usually be located in the game's view data for the Milestone.
* All previous subscribers or dispatchers of 
    * `MilestoneProgressAction` should now switch to use `ProgressMilestoneStateAction`
    * `MilestoneCompletedStateAction` should now switch to use `CompleteMilestoneStateAction`
* `normalizedProgress` now returns a double instead of a float

##### Modifier Cache
* The cache now uses HashSets to store `IModifiers`, `IModifiables`, and `IModifierFormula`.
* `_specificModifierLookup`, `_globalModifierLookup`, `_specificModifiableLookup`, and `_globalModifiableLookup` have been consolidated into `_modifierLookup` and `_modifiableLookup`. Methods have been updated to use the new lookup structure.

##### Modifier Service
* The `ModifierService` no longer automatically loads all `IBoost` Entities in the Entities Database. Instead, any `IBoost` should be loaded by it's owning Entity. For example, the `ShowcaseContent` is now responsible for loading the `IBoost` used for video ad bonuses. If required, the previous behaviour can be retained by reinstating the call `_entityLoader.LoadAllEntities<IBoost, IBoostData>()` when the `SetContentStateAction` is broadcast.
* `IModifierFormula` and `IModifierFormulaData` are now binded as singletons to their concrete type, which means only one instance of a type of `IModifierFormula` and `IModifierFormulaData` is available. 
* Added `ModifierService.GetModifierFormula` to retrieve the `IModifierFormula` of a specified type

##### Namespaces
* The following namespaces within `idlekit-implementation` have changed. Game code using classes within these will need to be updated.
    * `IdleKit` to `IdleKit.Implementation`
	* `IdleKit.PlotPoint` to `IdleKit.Implementation`
	
##### NPM
* The sub-dependencies in `package.json` have been removed. These should now be specified only at the top level `package.json` file within your Unity project.

##### PlotPoint
* `BasePlotPointActivationCondition` now requires the `staticDataId` passed into the constructor `ctor(string)`.
* `BasePlotPointActivationCondition.Initialize` has been renamed to `BasePlotPointActivationCondition.Subscribe()`.
* `PlotPointSetPlaybackAvailabilityAction` has been renamed to `SetPlotPointPlaybackAvailabilityAction`.
* `PlotPointPlaybackAvailabilityChangedAction` has been removed. Subscribe to `SetPlotPointPlaybackAvailabilityAction` instead.
* `PlotPointSequenceProgressAction` has been renamed to `PlotPointFramePlayedAction`. 
*  Previous implementation of `PlotPointDataProvider` has been moved to `PlotPointEditorDataProvider`.
*  `AscensionActivationCondition` has been renamed to `AscensionCompleteActivationCondition`.

##### Reward
* `AscensionReward.Initialize(double score)` has now been renamed to `AscensionReward.SetAscensionScore(double score)` due to the introduction of `IEntity.Initialize()`.

##### Services
* Renamed the following Services to better fit naming conventions. Any custom extensions of the below Services will need to be updated.
    * `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 `StaticDataLoaderService`

##### Timer Trunk
* The `TimerTrunk` implementation has been renamed to `TimedReward`. Related `IAction`s and `IStateAction`s have been renamed accordingly. Code that previously derived from `TimerTrunk` should now inherit from `TimedReward`.

##### Timer Subscription
* The overloaded constructor for `TimerSubscription` no longer accepts a `DateTime` endTime without an initial timestamp. Any constructors using this parameter will need to be updated appropriately.

### idlekit-tools
##### Actions
* `Event`s have been renamed to `Action`s.
* `PlayerEvent`s have been renamed to `StateAction`s.
* `AutoUnlockBuyGeneratorStateAction` has been removed. The functionality has been moved into the base `BuyGeneratorStateAction`.

##### Asset Importer
* The following headers have moved from the `GeneratorBalanceData` Asset Creator to the `GeneratorEntityData` Asset Creator. Custom implementations will need to be updated accordingly.
    * `costToBuy`
    * `buyCurrencyId`
    * `upgradeableCurrencyBuyRequirements`
    * `costToAutomate`
    * `automateCurrencyId`
    * `upgradeableCurrencyAutomationRequirements`

##### Core
* All `IEntity`, `IAction`, `IService`, and `CanvasView` have been refactored to work with dependency injection and implement `IInjectable`.

##### Namespaces
* The following namespaces have changed within `idlekit-tools`. Any code referencing classes within these will need to be updated:
	* `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
* `NumberFormatter.FormatDouble` will now round values under 1000 as specified via the `roundDown` argument. This makes the behaviour consistent with values above 1000, UI using this may need to be updated accordingly.

##### NPM
* The sub-dependencies in `package.json` have been removed. These should now be specified only at the top level `package.json` file within your Unity project.

##### Prefabs
* All prefabs are now nested prefabs which require a minimum Unity version of 2018.3.

### idlekit-examples
* N/A

### idlekit-showcase

##### General
* All entity interface classes have been moved into `idlekit-framework`.
* All entity concrete classes have been moved into `idlekit-implementation`.
* All importer classes have been moved into `idlekit-tools`.

##### Asset Importer
* `ShowcaseDataAssetImporter` has been moved into `idlekit-tools` and merged, merged with `BasicDataAssetImporter` and renamed to `SimpleDataAssetImporter`.
* All data asset headers and creator files have also been moved to `idlekit-tools` and renamed as follows:
    * `ShowcaseContentDataAssetHeader` to `StandardContentDataAssetHeader`
	* `ShowcaseEventContentDataAssetHeader` to `StandardEventContentDataAssetHeader`
	* `ShowcaseTimerTrunkDataAssetHeader` to `TimerTrunkDataAssetHeader`
	* `ShowcaseContentDataAssetCreator` to `StandardContentDataAssetCreator`
	* `ShowcaseEventContentDataAssetCreator` to `StandardEventContentDataAssetCreator`
	* `ShowcaseTimerTrunkDataAssetCreator` to `TimerTrunkDataAssetCreator`

##### Events
* `Event`s have been renamed to `Action`s.
* `PlayerEvent`s have been renamed to `StateAction`s.

##### Event Content
* `void IShowcaseEventSettingsSavedData.EndEvent()` has been removed. Use `void IEventSettingsSavedData.CompleteEvent()` instead.

##### NPM
* The sub-dependencies in `package.json` have been removed. These should now be specified only at the top level `package.json` file within your Unity project.

##### Prefabs
* All prefabs are now nested prefabs which require a minimum Unity version of 2018.3.

##### Showcase Content
* `IShowcaseContent` now requires a `videoAdBoost` property. This boost is intended to be used when the player views a video ad.
* `IShowcaseContentData` now requires a `videoAdBoostId` property.
* `IShowcaseContentSavedData` and `IShowcaseEventContentSavedData` have been added, which serialize a `CurrencyAmount` to the `IContentSavedData`. Deserialization of the saved data should be updated accordingly.
* `ShowcaseContent` and `ShowcaseEventContent`, along with their interfaces, have been moved to `idlekit-implementation` and `idlekit-framework`, and renamed `StandardContent` and `StandardEventContent`.

##### Showcase Upgradeable Currency
* `ShowcaseUpgradeableCurrencyData` has been removed. The `available` flag of a `UpgradeableCurrency` is now set via `StageData.availableCurrencyIds` or `ContentData.initialCurrencyAmounts`, either of which will make a `Currency` or `UpgradeableCurrency` available at the start of the `Content` or `Stage`.
* As a result of the above change, `ShowcaseUpgradeableCurrencyManager` has been removed. It's functionality, of setting the `UpgradeableCurrency.available` flag is now performed by the `NewStageStateAction` and `NewContentStateAction`.

##### TimerTrunk
* `ShowcaseTimerTrunk` and it's interface have been moved to `idlekit-framework` and `idlekit-implementation`. The classes have been renamed `ITimerTrunk` and `TimerTrunk`.

## Version 0.20.7 to 0.20.8, 2020-04-13
### idlekit-framework
* N/A

### idlekit-implementation
* N/A

### idlekit-tools
* N/A

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

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

### idlekit-implementation
* N/A

### idlekit-tools
* N/A

### idlekit-examples
* N/A

### idlekit-showcase
* N/A

## Version 0.20.5 to 0.20.6, 2019-12-11
* N/A

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

* `EventSettingsSavedData.completedMilestoneIds { get; }` has been deprecated. Instead of string ids, this data now saves a list of more complex `MilestoneCompletionInfo` objects. These objects allow for the future projection of Milestone completion times that handle players being away from the game when an Event is ended. Update your code to use `EventSettingsSavedData.milestoneCompletionInfo { get; }` instead. This change will break any existing saved data so it is recommended to either introduce this change between events or migrate existing data to the new format.
* `EventSettingsSavedData.CompleteMilestone(string milestoneId)` has been deprecated for the same reasons outline above. Use `EventSettingsSavedData.CompleteMilestone(string milestoneId, long timestampInMilliseconds)` instead.
* Since `EventSettings`, `EventSettingsData` and `EventSettingsSavedData` have had time related functionality moved into them, any custom code that added time related functionality should be inspected to ensure there are no conflicts.

### idlekit-implementation

* `IdleKitInitializedEvent` has been added to signify that all Entities within IdleKit have been initialized. If your integration of IdleKit does not use `Main.StartGame` this event must be sent after `Content.BeginStage` has been called.

### idlekit-tools

* N/A

### idlekit-examples

* * N/A

### idlekit-showcase

* * N/A

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

* N/A

### idlekit-implementation

##### Goal
* `GoalData.isContentSpecific` is now set to true by default. This allows for GoalData to be shared between different Contents while still ensuring that GoalSavedData is unique. When using the default `ISerializer` implementation, this will result in a filename change of the serialized JSON.

### idlekit-tools

* N/A

### idlekit-examples

* * N/A

### idlekit-showcase

* * N/A

## Version 0.20.2 to 0.20.3, 2019-09-16
* N/A

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

##### Generator
* `GeneratorEntity.payoutCurrencyPerSecond` has been deprecated and replaced by `GeneratorEntity.payoutCurrencyPerMilliSecond`. This resolves a bug which meant that `GeneratorEntity.payoutCurrencyPerSecond` was actually reporting back in milliSeconds while also avoiding any precision issues related to converting Payout to a float when reporting back in Seconds. To account for this change, any gameplay logic which requires absolute precision should be converted to work in milliseconds. Any UI code where precision is not required can convert the payout value to seconds.

### idlekit-implementation

##### ToggleTimedBoostPlayerEvent
* In order to avoid the possibility of a runtime error when passing the incorrect Boost type into the `ToggleTimedBoostPlayerEvent`, this event no longer derives from the `ToggleBoostPlayerEvent`. Any code that was previously listening to `ToggleBoostPlayerEvent` when requiring a `TimedBoost` should now listen to `ToggleTimedBoostPlayerEvent`.

### idlekit-tools

* N/A

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

## Version 0.20.0 to 0.20.1, 2019-07-18

* N/A

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

##### Content

* `void Ascend()` has been deprecated due to the implementation of the new ascension flow.
    * Instead, use `void BeginAscension()`, which signals the start of the ascension gameplay.
    * Then, use`void EndAscension()`, which concludes the ascension gameplay and grants the rewards.
    * Please refer to `docs.idlekit.io` for additional information.
* `IContentSavedData.lastActiveTimestamp` has been deprecated, use `ISavedData.timeModified` instead. This is due to the `ISavedData` refactor that added `timeCreated` and `timeModified` to all `ISavedData`.
* `IContentSavedData.SetLastActiveTimestamp(long)` has been deprecated, use `ISavedData.Save()` instead. This is due to the `ISavedData` refactor that added `timeCreated` and `timeModified` to all `ISavedData`.

##### Currency

* `bool ContainsTagIn(string[])` has been moved to the newly added `ITagService`, use `ITagService.ContainsAnyTag(ITagData[], string[])` instead.
* `bool ContainsTag(string)` has been moved to `ITagService`, use `ITagService.ContainsTag(ITagData[], string)` instead.

##### CurrencyManager

* `ICurrency[] GetAllCurrenciesOfTagOrRarity(string)` has been deprecated. `GetCurrenciesWithTag` should be used instead. This method is expected to return `ICurrency` with both the specified tag or rarity Id.

##### Economy

* `IEconomy.GetSpeed()` and it's overloads have been deprecated. Use `IEconomy.GetDuration()` and it's overloads instead. These methods return values in milliseconds now.

##### Gacha
* `GachaSlot.cs` and `GachaItem.cs` have been moved to `idlekit-implementation` due to the introduction of `IGachaSlot` and `IGachaitem`.
* `GachaSlot.HasClaimableItem` has been moved to `GachaReward.CanClaim(IGachaSlot)`.
* `GachaItem.cachedReward` has been removed as `IRewardManager` already caches the `IRewards`.
* `IGachaReward.GetValidItems(GachaSlot slot)` has been replaced to work with interface `RewardGetValidItems(IGachaSlot slot)`.
* `IGachaRewardData.gachaSlots { get; }` has been replaced to work with interface `IGachaSlot[] gachaSlots { get; }`.

##### Generator

* `double baseSpeed { get; }` has been deprecated in `IGeneratorBalanceData`. Use `long baseDuration { get; }` instead. This value is in milliseconds now. Data import is still in seconds.
* `double speed { get; }` has been deprecated in `IGeneratorEntity`. Use `long duration { get; }` instead. This value is in milliseconds now.
* `IGeneratorEntitySavedData.BuyGenerator(IGeneratorUnitTargetSequence)` has been deprecated. Use `void Buy(int)` and `void SetGeneratorUnitTargetHit(int)` instead. This is to simplify dependency during the usage of the function.
* `IGeneratorEntitySavedData.IncrementGeneratorUnit(int, IGeneratorUnitTargetSequence)` has been deprecated. Use `void IncrementGeneratorUnit(int)` and `void SetGeneratorUnitTargetHit(int)` instead. This is to simplified dependency during the usage of the function.
* `IGeneratorEntitySavedData.isUnlocked` and `IGeneratorEntitySavedData.Unlock()` have been removed as they are legacy features and similar functionality is now achieved by using combination of `IUnlockable.available` and `IUnlockable.obtained` on the `IUpgradeableCurrency` associated with the `IGeneratorEntity` (i.e: the cards representing the `IGeneratorEntity`).
* `GeneratorUnitTargetProgression` has been deprecated please use `IGeneratorUnitTargetSequence.GetProgression(int)` instead.
* `IGeneratorUnitTargetSequence.GetGeneratorUnitTargetLevel(int, int)` has been renamed to `IGeneratorUnitTargetSequence.GetGeneratorUnitTargetIndex(int)`.
* `IGeneratorUnitTargetSequence.GetGeneratorUnitTargetProgression(int)` has been renamed to `IGeneratorUnitTargetSequence.GetGeneratorUnitTargetAmount(int)`.

##### Goals

* `double seconds { get; }` has been deprecated in `IDynamicGoalData`. Use `long duration { get; }` instead. This value is in milliseconds now. Data import is still in seconds.

##### Modifiers

* `IModifierCache` must now be bound along with other dependencies so the `ModifierManager` can resolve it.
* `IModifier.modifierId` must be implemented on any Entities that implement `IModifier`. In most cases this should point to the static data id of the `IModifier`.
* `IModifierCategoryData.targetModifiableTypes` needs to be implemented on any custom `IModifierCategoryData` objects. This should return a list of `IModifiable` types that are allowed to be affected by this `IModifierCategoryData`.

##### Timed Rewards

* `float durationInSeconds { get; }` has been deprecated in `ITimedRewardData`. Use `long duration { get; }` instead. This value is in milliseconds now. Data import is still in seconds.
* `double timeRemaining { get; }` has been deprecated in `ITimedReward`. Use `long durationRemaining { get; }` instead. This value is in milliseconds now.
* `ITimedRewardSavedData` class has been deprecated. This is due to the `ISavedData` refactor that added `timeCreated` and `timeModified` to all `ISavedData`.

##### Trade
* The behaviour of when a `ITrade` is valid has changed. Previously the `available` and `obtained` flags of the `ICurrency` would only be checked for input/output `IUpgradeableCurrency`. These flags will now be checked on `ICurrency` as well.
* The implementation of Trades has been extensively refactored. Whereas previously only `ITradeData` existed in `idlekit-framework`, trades are now a full entity with an `ITrade` controller interface. Any trade specific logic should now be encapsulated within implementations of `ITrade` such as `Trade` which can be found in `idlekit-implementation`.
* As `ITradeData` is now an `IEntityData` rather than `IStaticData` any derived classes must implement a `Create` method that generates the `ITrade` Entity controller.
* Input and output tags for `ITradeData` are now specified as `ITagData` arrays to allow for multiple `ICurrency` tags to be specified.

##### Saved Data Provider

* `CreateSavedData(string, ISerializer)` has been changed to `CreateSavedData(string, IDependencyContainer)` due to the `ISavedData` refactor and preparation for the dependency container integration.
* The classes (and the ones that extend them) listed below have been switched to use the new method `CreateSavedData(string, IDependencyContainer)` to create the `ISavedData`.
  * The following classes are affected in `idlekit-implementation`: `BoostData`, `TimedBoostData`, `CharacterData`, `ContentData`, `CurrencyData`, `UpgradeableCurrencyData`, `GeneratorEntityData`, `GoalData`, `TimerTrunkData`, and `StageData`.
  * The following classes are affected in `idlekit-examples`: `RewardGeneratorEntityData`, and `LoopingContentData`.
  * The following classes are affected in `idlekit-showcase`: `ShowcaseTimerTrunkData`.

### idlekit-implementation

* `TimerTrunkData.initialDurationInSeconds` has been deprecated. Use `TimerTrunkData.initialDuration` instead. This value is in milliseconds now.

##### Events

* `AscensionCompleteEvent` has been renamed to `AdvanceStageEvent` for more clarity.
* `AscendPlayerEvent` has been renamed to `AscensionCompletePlayerEvent` which concludes the ascension gameplay and grants rewards.
* `BuyGeneratorPlayerEvent` has had function `UpdateGeneratorState()` renamed to `BeginProduction()` for clarity, and `UnlockGenerator()` deprecated due to the removal of `IGeneratorEntitySavedData.Unlock()` method.
* `LogLastActiveTimePlayerEvent` has had constructor changed from `ctor(ITimerService)` to `ctor()` as `ITimerService` is no longer needed when `ISavedData.Save()` would modify the `timeModified`.

##### Generators

* `AutoCollectState.collectDuration` is now a `long` instead of a `float`. This value is in milliseconds now.
* `GeneratorUnitTargetSequenceData`'s default constructor `ctor()` has been removed but without a `System.Obsolete` tag because it is still use by the ScriptableObject internally and thus will throw an error.

##### Goals
* The following `IGoal`s' constructors have been changed to `ctor(string, TGoalData, IGoalSavedData, IEventManager, IEntityCache, ITagService, ITagData[])` due to the tag refactor:
    * `CollectCurrenciesWithTagsGoal`
    * `DynamicCollectCurrenciesWithTagsGoal`
    * `SpendCurrenciesWithTagsGoal`
    * `UpgradeCurrenciesWithTagsGoal`

* The following `IGoalData`s' constructors have been changed to `ctor(string, string, double, string[])` due to the tag refactor:
    * `CollectCurrenciesWithTagsGoalData`
    * `DynamicCollectCurrenciesWithTagsGoalData`
    * `SpendCurrenciesWithTagsGoalData`
    * `UpgradeCurrenciesWithTagsGoalData`

##### Main

* Due to deprecation of `AscensionCompleteEvent` the `Main.cs` now listens to `AdvanceStageEvent` to load the new `IStage`.

##### Modifiers

* If `ModifierManager` has been extended, or a custom `ModifierCache` has been implemented, the following applies:
    * `ModifierManager` has been completely refactored and is no longer a partial class. Any custom solutions that made use of the partial class will now have to be reworked to implement `IModifierManager` or extend `ModifierManager` and be bound into the dependency system.
* `ModifierCache.GetModifiersAffectingModifiable(string modifiableId)` and `ModifierCache.GetModifiersAffectingModifiable<TModifierCategoryData>(string modifiableId)` have been changed to return `IModifiers` that affect the given `IModifiable` via `ModifierData.affectAll`. Previously these would not be returned. These methods also have new strict `IModifierCategoryData` verification that will not return `IModifier` objects that can not be affected by a given `IModifierCategoryData`.

##### Plot Point Manager

* Constructor `ctor(IPlotPointDataProvider, IEventManager, ISerializer)` has been changed to `ctor(IDependencyContainer)` for simplicity.

##### Saved Data

* The constructor signature changed from `ctor(string, ISerializer)` to `ctor(string, IDependencyContainer)` due to the `ISavedData` refactor.
* The classes (and the ones that extend them) listed below have been switched to use the new constructor `ctor(string, IDependencyContainer)`.
   * The following classes are affected in `idlekit-implementation`: `BoostSavedData`, `TimedBoostSavedData`, `CharacterSavedData`, `ContentSavedData`, `CurrencySavedData`, `UpgradeableCurrencySavedData`, `GeneratorEntitySavedData`, `GoalSavedData`, `PlotPointSequenceCollectionSavedData`, `TimerTrunkSavedData`, `StageSavedData`, and `UserSavedData`.
   * The following classes are affected in `idlekit-examples`: `RewardGeneratorEntitySavedData`, and `LoopingContentSavedData`.
   * The following classes are affected in `idlekit-showcase`: `ShowcaseTimerTrunkSavedData`.

##### Time Management

* `TimerSubscription(float durationSeconds, bool loop = false)` has been deprecated. Use `TimerSubscription(long duration, bool loop = false)` instead.
* `TimerSubscription(float durationSeconds, long initialTimestamp, bool loop = false)` has been deprecated. use `TimerSubscription(long duration, long initialTimestamp, bool loop = false)` instead.
* `TimerTrunkData.durationInSeconds` has been deprecated. Use `TimerTrunkData.duration` instead. This value is in milliseconds now.

##### Trade

* With the extensive refactor of the Trade system, a full `Trade` Entity controller has been added containing much of the logic that used to live in `TradeSet`. `TradeService` has also been added, replacing the functionality for accessing different `TradeData` that was previously available through `TradeSet`.
* The functionality of `TradeSet.GetValidTrades` can now be achieved via `TradeService.GetTrade` or `TradeService.GetTrades` and then calling `Trade.IsValid`. In the same way calls to `TradeSet.GetValidTradesWithInputTag` and `TradeSet.GetValidTradesWithOutputTag` should be replaced by `TradeService.GetTradesWithInputTag` or `TradeService.GetTradesWtihOutputTag` and then calling `Trade.IsValid`.
* The `MakeExchangePlayerEvent` now longer has to be called directly from UI. Instead `Trade.MakeTrade` should be used.

### idlekit-tools

##### Asset Importer
* Asset Creators for the following Entity Datas now require a `targetTagIds` arrays and a `targetAll` flag in the input csv data:
  * `RandomTagsCurrencyReward`
  * `CollectCurrenciesWithTagsGoal`
  * `DynamicCollectCurrenciesWithTagsGoal`
  * `SpendCurrenciesWithTagsGoal`
  * `UpgradeCurrenciesWithTagsGoalData`
  * `RandomTagsCurrencyReward`
* The Asset Creator for `TradeData` now require `inputCurrencyTagIds` and `outputCurrencyTagIds` arrays in the input csv data.

##### Trade
* `TradeSet` has been deprecated, see information above for more detail.

### idlekit-examples

* N/A

### idlekit-showcase

##### Showcase Content
* The `ShowcaseContentDataAssetCreator` requires that input csv data now contain a `tradeCooldownDuration` field.
* `ShowcaseContentParameters` now take an array of `Trade`s rather than the deprecated `TradeSet`.

##### Event
* `AutoUnlockBuyGeneratorPlayerEvent.UnlockGenerator` has been changed to `AutoUnlockBuyGeneratorPlayerEvent.Apply` due to the `BuyGeneratorPlayerEvent` change.

##### Event Content
* All Content data associated with events has been changed to `ShowcaseEventContent` which derives from `EventContent`. This showcases the ability to track `Milestone` progress while in an event.
* A new global `EntitiesDatabase` has been added to `Main`. The idea behind this data is that it is always loaded no matter what `Content` is loaded. Only globally required data should be stored here to reduce memory use.
* A `ShowcaseEventSettings` class has been added to the project to showcase one potential method for implementing limited time events. Ideally the actual implementation would use a backend to supply the time related data. `EventSettings` is a nice place to save event related data because it is globally accessible and can be read even when not in the Event Content.

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

##### Generator

* `double baseSpeed { get; }` has been deprecated in `IGeneratorBalanceData`. Use `long baseDuration { get; }` instead. This value is in milliseconds now. Data import is still in seconds.
* `double speed { get; }` has been deprecated in `IGeneratorEntity`. Use `long duration { get; }` instead. This value is in milliseconds now.

##### Goals

* `double seconds { get; }` has been deprecated in `IDynamicGoalData`. Use `long duration { get; }` instead. This value is in milliseconds now. Data import is still in seconds.

##### Economy

* `IEconomy.GetSpeed()` and it's overloads have been deprecated. Use `IEconomy.GetDuration()` and it's overloads instead. These methods return values in milliseconds now.

##### Timed Rewards

* `float durationInSeconds { get; }` has been deprecated in `ITimedRewardData`. Use `long duration { get; }` instead. This value is in milliseconds now. Data import is still in seconds.
* `double timeRemaining { get; }` has been deprecated in `ITimedReward`. Use `long durationRemaining { get; }` instead. This value is in milliseconds now.

### idlekit-implementation

##### Time Management

* `TimerSubscription(float durationSeconds, bool loop = false)` has been deprecated. Use `TimerSubscription(long duration, bool loop = false)` instead.
* `TimerSubscription(float durationSeconds, long initialTimestamp, bool loop = false)` has been deprecated. use `TimerSubscription(long duration, long initialTimestamp, bool loop = false)` instead.
* `TimerTrunkData.durationInSeconds` has been deprecated. Use `TimerTrunkData.duration` instead. This value is in milliseconds now.
* `TimerTrunkData.initialDurationInSeconds` has been deprecated. Use `TimerTrunkData.initialDuration` instead. This value is in milliseconds now.

##### Generators

* `AutoCollectState.collectDuration` is now a `long` instead of a `float`. This value is in milliseconds now.

### idlekit-tools

* N/A

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

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

##### Currency
* `ICurrency.ContainsTagOrRarity` has been renamed to `ICurrency.ContainsTag` for simplicity

### idlekit-implementation

##### Goal
* `DynamicCollectCurrencyTypeGoalData`'s `double secondsUntilComplete { get; }` has been renamed to `double seconds { get; }`

##### Events

* The constructors for the following `IEvent`s must now be passed an `IEventManager`:
  * `ClaimGoalPlayerEvent`
  * `CheckGeneratorUnitTargetHit`
  * `ClaimTimedRewardPlayerEvent`
  * `OpenTimerTrunkPlayerEvent`

##### Rewards

* `AscendPlayerEvent.GetRewardIds` can now be found on the new `AscensionReward` class.

### idlekit-tools

* N/A

### idlekit-examples

* N/A

### idlekit-showcase

* N/A

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

##### Generator
* `void RefreshCache()` has been deprecated on `IGeneratorEntity` but it is still available in the implementation `GeneratorEntity`. It was removed because the function was too specific.

##### Managers
* `void RegisterCurrency()` and other similar functions have been removed from `ICurrencyManager` but they are still available in the implementation of the interface `CurrencyManager`. They were removed because the functions were too specific to the `idlekit-implementation`.
* `void RegisterModifier()`, `void UnregisterModifier()` and other similar functions have been removed from `IModifierManager` but they are still available in the implementation of the interface `ModifierManager`. They were removed because the functions were too specific to the `idlekit-implementation`.
* `void RegisterReward()` and other similar functions have been removed from `IRewardManager` but they are still available in the implementation of the interface `RewardManager`. They were removed because the functions were too specific to the `idlekit-implementation`.

##### Time
* All time stamp related fields, properties, or parameters have had their names changed to `timestamp` in milliseconds format for consistency.
* `ITimerListener`'s `OnUnSubscribe()` has been removed because the object should be responsible for its own un-subscribing.
* All `ITimerService` methods that previously worked with an `(out uint requestId)` and other parameters have been refactored to work with an `ITimerListener` only to clean up the API. While the time subscription (i.e: `duration, initialTime, looping`) information can be found at `ITimerListener.ITimerSubscription`.

##### User Saved Data
* `IUserSavedData` has been removed from `ISavedDataManager` to reduce coupling. Use the `IEntityCache.Resolve<IUserSavedData>()` to retrieve and use the `IUserSavedData`.

### idlekit-implementation

##### Event Manager
* `ActionManager` has been removed due to the confusion it created as it shared too many similar functionality with `EventManager`. Please use `EventManager` in place of `ActionManager`.
* `ActionManager`'s action queue system makes it very difficult to debug and would easily introduce execution order dependent bugs. The queue has been removed and all `IEvent` are dispatched immediately.

##### Goals
* The following `Goal` related name changes include the renaming of all the `GoalDataAsset` involved. Therefore, all the `GoalDataAssets` related to the `Goals` mentioned below need to be re-imported.
* `CollectCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectCurrencyTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `CollectUpgradeableCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectUpgradeableCurrencyTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `DynamicCollectCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `DynamicCollectCurrencyTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `SpendCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `SpendCurrencyTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.

##### Unity Event Listener
* `UnityEventListener` is no longer an `IService` as it derives from a `MonoBehaviour`; therefore, it goes through a different create and initialize sequence compare to regular C# `IService`s.

##### Timer Trunk
* As the unlock functionality of the `TimerTrunk` is specific to the showcase game, it has been moved to a new `ShowcaseTimerTrunk` implementation that can be found in the Showcase repo.
* A new `initialDuration` field has been added to allow the duration of the initial subscription to the timer service to vary from subsequent subscriptions.
* The `TimerTrunk` no longer has to be initially claimed before it will be subscribed to the timer service. To retain the previous behavior, where the trunk would be immediately available on the first initialization, set the new `initialDuration` data field to `0`.

### idlekit-tools

##### CanvasView
* `void CanvasStageView.SetStage(IStage)` is now `protected` instead of `public`  as the `IStage` is set by listening to the `StageInitializedEvent`.

##### Plot Points
* The `PlotPointEditor.SaveSequence` functionality has changed significantly. If you are utilizing this functionality, re-read the method to make sure you still get the intended results.

### idlekit-examples

* N/A

### idlekit-showcase

##### Data

* Timed Rewards
  * `TimerTrunk` header and data types are now `ShowcaseTimerTrunk`.
  * `id` and `dataName` fields changed to `mg01_showcase_timer_trunk`.
  * `initialDurationInSeconds` has been added.
  * `unlockStageId` has been added. Previously this existed in the Content data.
* Content
  * `timerTrunkUnlockStageId` has been removed. This now exists in Timed Rewards data.
  * `timerTrunkId` has changed to `mg_01_showcase_timer_trunk`.

## Version 0.16.0 to 0.17.0, 2019-3-15
### idlekit-framework
##### Entity
* `ICurrencyGoal` has been deprecated as `IGoal` no longer needs to have all the `ICurrency` injected due to the introduction of `IEntityCache`
* `IGeneratorGoal` has been deprecated as `IGoal` no longer needs to have all the `IGenerator` injected due to the introduction of `IEntityCache`
* `IEntityController`'s `void Cleanup(ILoaderService loaderService);` has been changed to `void Cleanup(IEntityCache entityCache);` to avoid having too much responsibility being injected
* All `IEntityData`'s `T Create<T>(IDependencyContainer dependencyContainer, string instanceId)` method shas been moved to `idlekit-examples`. This is done to avoid confusion since `idlekit-implementation` does not utilize the instancing feature, please use ` T Create<T>(IDependencyContainer dependencyContainer)` or check out `IInstanceEntityData` in the `Instance` example

##### Goal
* `IGoalData`'s `float[] difficultyIncrement { get; }` has been removed from the project due to the removal of `IDifficultyManager`

##### Loader
* `TReturn LoadEntity<TReturn,TData>(string dataId, string instanceId)` has been moved to `idlekit-examples`. This is done to avoid confusion since `idlekit-implementation` does not utilize the instancing feature in `idlekit-implementation`, please use `TReturn LoadEntity<TReturn,TData>(string dataId)` or check out `IInstanceLoaderService` in the `Instance` example

### idlekit-implementation

##### Exception & Error Events deprecated
* `ExceptionEvent` and `ErrorEvent` have both been deprecated. The new `IdleKitLog` should be used in place of these, for example:

  ```
  ExceptionEvent exceptionEvent = eventManager.GetEvent<ExceptionEvent>();
  exceptionEvent.caller = this;
  exceptionEvent.exception = new InvalidGoalDataException(this, "exception message");
  eventManager.DispatchEventImmediate(exceptionEvent);
  ```

  is replaced by:

  ```
  IdleKitLog.LogException(new InvalidGoalDataException(this, "exception message"));
  ```

  If you were previously listening to `ExceptionEvent` or `ErrorEvent`, this functionality can be replicated via Unity's `Application.logMessageReceived`. More information is available in the [Unity documentation](https://docs.unity3d.com/ScriptReference/Application-logMessageReceived.html).

##### Goals
* The following `Goal` related name changes include the renaming of all the `GoalDataAsset` involved. Therefore, all the `GoalDataAssets` related to the `Goals` mentioned below need to be re-imported.
    * `IGoalData.amount` is no longer an optional field (has to be > 0) for `AutomateGeneratorTypeGoal` and `BuyGeneratorTypeGoal`.
* `AutomateSpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `AutomateGeneratorTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `BuySpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `BuyGeneratorTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `CollectCurrenciesOfRarityGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectCurrenciesWithTagsGoal` to work with all `ITagData` instead of `IRarityData`.
* `CollectFromSpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `CollectFromGeneratorTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `GetGeneratorUnitsForSpecificGeneratorGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `GetGeneratorUnitsForGeneratorTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `GetUpgradesForSpecificCurrencyGoal` and its corresponding `IGoalData` and `IGoalDataAsset` have been renamed to `GetUpgradesForCurrencyTypeGoal` due to the introduction of instancing. The `IGoal` no longer targets just one instance but multiple instances of the same staticDataId.
* `GoalEvent` is removed because the `IGoalSavedData` alteration should only be in an `IAction`. Use `ProgressGoalAction` and `SetProgressGoalAction` instead.

##### StaticDataManager and LoaderService errors
* All varients of the `GetData` methods in `StaticDataManager` now adds an entry to the log rather than hard failing when a requested Entity or type does not exist. As a result execution will now continue when a requested Entity or collection of Entities do not exist.

  This means that code calling the `LoaderService` also no longer needs to check for possible invalid entries before calling `LoaderService.LoadAllEntities`, for example:

  ```
  ICharacter[] characters = characterIds.Length > 0 ? loaderService.LoadAllEntities<ICharacter, ICharacterData>(characterIds) : new ICharacter[0];
  ```

  Can be replaced by:

  ```
  ICharacter[] characters = loaderService.LoadAllEntities<ICharacter, ICharacterData>(characterIds);
  ```
* All varients of the `GetData` methods that can return arrays will now return empty arrays when the requested Entity type does not exist in the Entities Database. Previously the behavior was inconsistent with some methods returning empty arrays and others returning null/default.

* The `GetDataForIds` method will now return an array with elements for every valid Id that is passed as an argument. Previously the behavior was for the method to return an empty array if any Id passed was invalid.

* For consistency `GetData<T>(Predicate<T>)` an array rather than a `IEnumerable`.

### idlekit-tools

### idlekit-examples

### idlekit-showcase

##### ShowcaseContent
* Data class now requires that you have a "timerTrunkUnlockStageId" which will dictate when the UI should allow the user to interact with the Timer Trunk as well as when the Timer Trunk should activate.

## Version 0.15.0 to 0.16.0, 2019-02-19
### idlekit-framework

##### Repository Restructure

* The Idlekit repositories have been restructured to make the division of code responsibility more obvious. Idlekit now contains the following repositories:
  * `Framework`: Containing only the interface classes of Idlekit. Previously these classes were found in the Idlekit repository.
  * `Implementation`: The implementation classes of the interfaces found in Framework. Previously this code was found in the Idlekit repository.
  * `Tools`: Common and tools code, such as the Data Importer and Plot Point Editor. Previously this code was found in both the Idlekit and Idlekit-Example repositories
  * `Examples`: A set of small, self contained example scenes that show how core concepts within Idlekit operate. Previously this functionality was found in the Idlekit-Example repository.
  * `Showcase`: A game implementation that showcases the features of Idlekit. Previously this functionality was found in the IdleKit-Example repository.
* As part of this restructure, the namespaces within Idlekit have been rationalized. The following changes have been made:
  * `Idlekit.Showcase` has been added. All code specific to the Showcase project now exists within this namespace.
  * `Idlekit.Showcase.Test` has been added and holds any tests specifically for the Showcase project.
  * `Idlekit.Showcase.DataAssetImporter` has been added and contains the Showcase specific importer code.
  * `Idlekit.Examples` has been renamed from `Idlekit.Example` and now contains only code that is specific to the examples.
  * `Idlekit.Examples.Test` has been renamed from `Idlekit.Example.Test` and now only contains tests specific to the examples.
  * `Idlekit.PlotPoint` has been renamed from `Idlekit.PlotPoints` and now contains all runtime code for Plot Points.
  * `Idlekit.Tools.PlotPoint` has been added. All editor and non-runtime Plot Point code now resides in this namespace including the contents of `Idlekit.Example.PlotPoints.Editor` which has been removed.
  * `Idlekit.Example.PlotPoints` has been removed.
  * `Idlekit.Editor` has been added for general code used only in editor.
  * `Idlekit.Tools.Editor` has been added for tools specific editor code.
  * `Idlekit.Tools.Common` has been added. Code shared between the examples and showcase, mostly UI related, now resides here.
  * `Idlekit.Tools.Common.Debug` has been renamed from `Idlekit.Example.Debug`.
  * `Idlekit.Tools.DataAssetImporter` has been renamed from `Idlekit.DataAssetImporter`.
  * `Idlekit.Tools.Test` has been renamed from `Idlekit.Test`. This is now the only namespace for core Idlekit tests.

##### Entity Refactor

* The `IEntityData` interface has been added:
  * All Static Datas that are owned directly by Entity Controllers should inherit from this interface.
  * This interface requires that a `Create<T>` method be implemented on derived types.
    * This method is responsible for creating the Entity Controller (`IEntityController`) along with any other dependencies for the Controller such as `ISavedData`. See `StageData.Create<T>` for an example.
    * This creation functionality previously lived in the `ILoaderService` for each Entity type.
* The `IEntityyController` interface has been added. Each Entity Controller should now inherit from this interface.
  * The interface requires that getters be implemented for `instanceId` and `staticDataId`. Both of these members should be set via the `IEntityData.Create<T>` method.
    * The `staticDataId` should be taken from the `IEntityData` that is creating the Entity Controller
    * The `instanceId` should be unique if you wish to allow for instancing of your Entity Controller
  * The interface also requires that a `Cleanup(ILoaderService)` method be implemented. This method is called when the object (and any entities it is the owner of) should be unloaded from the loader service.
* The following Entity Controllers are now `IEntityController`s:
  * IBoost
  * ICharacter
  * IContent
  * ICurrency
  * IExchangeRate
  * IGeneratorUnitTargetSequence
  * IGeneratorEntity
  * IGoal
  * IModifier
  * IReward
  * ITimedReward
  * IStage
* 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.

##### Loader Service Refactor
* As a result of the changes to Entities described above, the `ILoaderService` interface has been simplified and genericized.
* All Entity specific load methods have been removed.
  * This functionality is instead now found within each Entities `IEntityData.Create<T>` method which is invoked directly by the `ILoaderService`.
* For example, a call `_loaderService.LoadStage(_stageId)` would be replaced with `_loaderService.LoadEntity<IStage, IStageData>(_stageId, _stageInstanceId)`.
* `ILoaderService` now implements the following methods:
  * `UnloadEntity`
  * `LoadEntity<TReturn, TData>`
  * `LoadAllEntities<TReturn, TData>`
  * `LoadAllEntitiesOfType<TReturn, TData>`
  * `Clear`

##### Generator Refactor

* `IGenerator`:
  * Renamed to `IGeneratorEntity`.
  * `IGeneratorEntity` requires (and is created by) the `IGeneratorEntityData`.
  * Be sure to implement the `generatorEntityData`(all data) and `generatorData`(defining data) separately as they are.
    * Because the `generatorData` defines the generator conceptually, it will likely be a constant between many different `IGeneratorEntity` objects. The balance and the rewards might change, but the idea, relationships, definition, and look of the 'same' generator (GeneratorData) from stage to stage should stay consistent. IE: The idea of a "Gas Station" being a generator in a game needs only one `IGeneratorData` but will have many `IGeneratorEntityData` to allow different rewards and/or balances depending on the stage.
    * Because of the above, `modiableData` should return `generatorData` so that a single relationship between modifier and modifiable can be made but still persist from stage to stage despite each stage likely having unique `GeneratorEntityData` references.
* `IGeneratorStageData`:
  * The data held within this class now lives in `IGeneratorEntityData`.
  * As a result, `IStage` no longer needs a `GeneratorStageData` array and instead only needs to reference an array of `IGeneratorEntityData` ids to define which generators will run in the stage.
* `IGeneratorData`:
  * Data input where this object is used is now in the `IGeneratorEntityData` assets instead of the `IStageData` assets. No longer has an `isContentSpecific` boolean.
  * Still implements the `IModifiableData` that will be used by the `IModifiable` portion of the `IGeneratorEntity` (instead of passing that responsibility off to `IGeneratorEntityData`). This is because `IGeneratorData` is the constant between the same generator concept from stage to stage (IE: "Gas Station", "Pet Store", etc). This way, referencing a `GeneratorData` as a modifier's target will persist that relationship from stage to stage. See the `IGenerator` UpgradeNotes for extra details.
* `IGeneratorBalanceData`:
  * Is now referenced by `IGeneratorEntityData` assets instead of the `IStageData` assets.
* `IGeneratorUnitTarget`:
  * This object was doing nothing but holding a reference to its data and is removed. Reference a `IGeneratorUnitTargetData` instead.
* `IGeneratorUnitTargetSequenceData`:
  * Is now referenced by `IGeneratorEntityData` assets instead of the `IStageData` assets.
* `IGeneratorSavedData`:
  * `IGeneratorSavedData.BeginProduction` was doing extra calculations due to its param being a DateTime. This param has changed to `long timestampMs`.
  * Due to the above change, `IGeneratorSavedData.startProducingTime` has been deprecated. Use `timestampMs` instead.
  * `_startProductionTotalMs` is removed as `IGeneratorSavedData` implements `ITimedSavedData`.

##### IUnlockable Implementation
* This new interface can be used as a way of marking an Entity that can be both `available` (the player can earn or be rewarded the Entity) and `obtained` (the player has aquired the Entity).
* Both `ICurrency` and `IUpgradeableCurrency` now inherit from `IUnlockable` and implement getters for `available` and `obtained`.
  * On `IUpgradeableCurrency` the `isOwned` flag is now replaced by `obtained` to reflect the changes to the new available and obtained logic.
  * Also on `IUpgradeableCurrency` the `isUnlocked` flag is replaced by `available` to reflect the changes to the new available and obtained logic.
* `IUpgradeableCurrencySavedData.isUnlocked` is replaced by `IUnlockable.available` to reflect the changes to the new available and obtained logic.

##### Goal Refactor
* `IGoal` has been refactored so that Goals can operate in isolation. They no longer have any reference to sequences or other indicies related to the ordering of goals within a `IStage`.
* As a result, `IGoalSequenceSavedData` has been renamed to `IGoalSavedData` with each `IGoal` owning it's own `IGoalSavedData`.
  * `IStageSavedData` no longer handles goal saved data as a result.
  * `IGoalSequenceSavedData.slotIndex` and `IGoalSequenceSavedData.goalIndex` have been removed and this goal tracking functionality is now handled by `IStageSavedData.activeGoalIndicies`.

##### IBoostData
* As a result of the Entity refactor, `IBoost CreateBoost(ISavedDataManager savedDataManager, IActionManager actionManager)` has been deprecated please call IEntityData.Create<T> instead.

##### IBoostSavedData
* `IBoostSavedData.isActive` is moved to `IBoost.isActive`.

##### IRewardData
* As a result of the Entity refactor, `CreateReward(ICurrencyManager, IRewardManager, IActionManager)` has been deprecated, please use `CreateReward(ICurrencyManager, IRewardManager)`.

##### IUpgradeableCurrency
* `IUpgradeableCurrency.currentLevel` is replaced by `IUpgradeable.level` for consistency.

### idlekit-implementation

##### ClearContentAction
* The constructor now requires `ILoaderService` to be passed as a dependency.

##### CollectFromGeneratorAction
* The constructor no longer requires `IEconomy` to be passed as a dependency.

##### CurrencyUnlockedEvent
* `CurrencyUnlockedEvent` is renamed to `CurrencyObtainedEvent` to reflect the changes to the new available and obtained logic.

##### GrantRewardAction
* `GrantRewardAction.GrantRewards` deprecated all but one signature: `GrantRewards(string[] rewardIds, int randomSeed)`.

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

##### RandomRarityCurrencyReward
* `RandomRarityCurrencyReward` along with its `IStaticData` and `ISavedData` have been renamed to `RandomTagCurrencyReward`.

##### TimedBoost
* `duration` has been renamed to `timeRemaining` for consistency with other similar calls.

##### UpgradeLevelData
* As `UpgradeLevelData` now inherits from `IUpgradeLevelData` the return type of `UpgradeLevelData.upgradeRequirements` is now `IUpgradeRequirement`. Functionality which relied on this property returning `UpgradeRequirement` must now cast the returned object to this type.

### idlekit-examples

* N/A

### idlekit-tools
##### RandomCurrencyRewardDataAssetCreator
* `RandomCurrencyRewardDataAssetCreator` is renamed to `RandomTagCurrencyRewardDataAssetCreator` for consistency.

##### DataAssetImporter
* `DataAssetImporter` and related classes have been renamed to `BaseDataAssetImporter`. These classes have also been virtualized to allow derived implementations of `BaseDataAssetImporter`. Constants header scripts have also been moved into Showcase repo.
* The importer no longer supports the generation of sparse arrays in data structures. If csv data contains empty entries between populated entries (eg. ) these entries must be consolidated (eg. ,currency1, currency2, , ,currency3, should become ,currency1, currency2, currency3,). If this is not done the importer will cease generating data for a given structure on the first empty entry found.

##### ExampleContent
* `ExampleContent` has been renamed `ShowcaseContent` and moved into Showcase repo.

### idlekit-showcase
##### DataAssetImporter
* `ShowcaseDataAssetImporter` and related classes have been implemented based on the base classes in the tools repo. Constants header scripts have been moved into Showcase repo.

##### ExampleContent
* `ExampleContent` has been renamed `ShowcaseContent` and moved into Showcase repo.

## Version 0.14.0 to 0.15.0, 2019-01-07

##### BuyMissingResourcesAction
* BuyMissingResourcesAction has been deprecated in v0.15.0, please use MakeExchangeAction instead, which functions identically.

##### Example Project
* A new `ExampleContent` type which derives from `Content` has been added into the Example Project. Where `Content` aims to showcase an in-game implementation of each core idlekit concept, the `ExampleContent` is designed to show extended functionality which may be of use in your game. Extended functionality such as Trades and TimerTrunk has been implemented in the `ExampleContent` and the Missing Resource ExchangeRate functionality that was previously in `Content` has been moved to `ExampleContent`.

##### ExampleContentDataAssetCreator
* `ExampleContentDataAssetCreator` now inherits from a `BaseContentDataAssetCreator` to allow for shared functionality between it and the `ContentDataAssetCreator`. If you have implemented a custom ContentDataAssetCreator it should now inherit from `BaseContentDataAssetCreator`.

##### GachaItem
* `GachaItem.weight` has been deprecated in 0.16.0, use `GachaItem.randomWeight` instead.

##### IContent
* `IContent` and `IContentData` had `missingResourcesExchangeRate` and `missingResourcesExchangeRateId` removed as they were to specific to the example project. For reference, see `ExampleContent` in idlekit-example.
* `IContent` previously had two constructors where it shouldn't have (one was unused). The removed constructor was one that ignored the `stageIds` field of `IContent`.

##### ICurrencyManager
* `GetAllCurrenciesOfRarity` is deprecated in v0.15.0. Please use `GetAllCurrenciesOfTagOrRarity` instead.
* `ICurrencyManager` now requires a GetAllCurrenciesOfTagOrRarity() method. If you have a custom class that derives from `ICurrencyManager` it must now implement this function. See CurrencyManager.cs for a sample implementation.

##### ICurrency
* `ICurrencyManager` now requires a ContainsTagOrRarity() method. If you have a custom class that derives from `ICurrency` it must now implement this function. See Currency.cs for a sample implementation.

##### IGlobalUpdateManager -> IUnityEventListener
*  `IGlobalUpdateManager` has been replaced with `IUnityEventListener`.
*  `IUpdateable`, `ILateUpdateable`, and `IFixedUpdateable` have been removed. Listeners for those methods should register with the corresponding events `OnUpdate`, `OnLateUpdate`, and `OnFixedUpdate` on `IUnityEventManager`.

##### ITimerService
* `long GetUnixTimeStampInSeconds` and `long GetUnixTimeStampInMilliseconds` have been changed to `double timestampInSeconds` and `double timestampInMilliseconds` to avoid casting.
* `Tick(float elapsedTime)` has been changed to `ProcessSubscriptions()`.

##### LoadContentAction
* No longer begins the content automatically by calling `IContent.Load`, that responsibility now lies in the class that fired this action. In our case, Main.cs.

## Version 0.13.2 to 0.14.0, 2018-11-23

##### GrantRewardAction
* `rewards` is deprecated and renamed to `rewardResults` for clarity.

##### IContent
* `CanAscend` has been deprecated, please use `IStage.CanAscend` on `the currentStage` instead.

##### IContentData
* `stageSequenceDatas` has been deprecated and moved to example specific `LoopingContentData`. IdleKit now only contains a basic `ContentData` data class that holds a list of stage ids.
* `stagePlaythroughStyle` has been deprecated as we now subclass `ContentData` with `LoopingContentData` for different playstyles.
* `GetStageData` has been deprecated in, please call `IContent.currentStageId` instead.
* `GetNextStageData` has been deprecated in, please call `IContent.nextStageId` instead.
* `GetNextStageDataIndex` has been deprecated in, please call `IContent.nextStageId` instead.

##### IContentSavedData
* `playthroughAmounts` has been deprecated since it is too specific for an interface implementation.
* `IncrementPlaythrough` has been deprecated since it is too specific for an interface implementation.
* `SetCurrentStageIndex` has been deprecated since it is too specific for an interface implementation.
* The above variables have been moved to the example specific `LoopingContentSavedData`.
* `currentStageIndex` has been deprecated since it is too specific for an interface implementation, please call `currentStageId` instead.
* `BeginContent` has been deprecated, please use setter of `hasStarted` instead.

##### ICurrency
* `Has(double amount)` has been deprecated since we want to support a gameplay that the user can `Add` or `Remove` a positive or negative amount, please call `Get()` and compare the values instead.

##### ICurrencyManager
* `HasCurrencyAmount(string id, double amount)` has been deprecated since we want to support a gameplay that the user can `Add` or `Remove` a positive or negative amount, please call `GetCurrencyAmount(string id)` and compare the values instead.
* `ICurrencyManager` no longer listens to `StaticDataAdded` event. Instead, `ICurrencies` are now loaded and registered to `ICurrencyManager` in `LoadContentAction`.

##### IEconomy
* Some methods related to the cost of generator units have been refactored to improve usability and functionality.
* `IEconomy.GetMaxGeneratorUnit` has been renamed to the more accurate `GetAffordableUnitsToNextTarget`.
* `Economy.GetMaxGeneratorUnit` has been moved to `IEconomy` and renamed `GetMaxAffordableUnits`. A 'max' argument has been added which allows for a cap on the maximum number of units the be specified, a default of -1 can be passed for no cap. The 'reserve' argument has been removed as the currency reserve is now calculated internally.
* See `CanvasGeneratorView.cs` in idlekit-example for an example of how this functionality is used.
* `GetPayout(IGenerator generator, bool applyModifiers, int additionalLevels)` has been deprecated in, please use `GetPayout(IGenerator generator, bool applyModifiers)` instead
* `GetSpeed(IGenerator generator, bool applyModifiers, int additionalLevels)` has been deprecated in, please use `GetSpeed(IGenerator generator, bool applyModifiers)` instead

##### IExhangeRates
* `IExchangeRate` has been added to allow a conversion rate to be calculated between two exchangable items.
* As `ICurrency` now inherits from `IExchangable` all `Currency` types must implement a `GetExchangeValue()` method to allow for exchange rates to be calculated. See `Currency.GetExchangeValue()` as an example implementation.
* `IContent` now contains a missing resources `ExchangeRate` that can be used to calculate an exchange rate. As a result, `IContentData` now contains an Id for the missing resources exchange rate asset.

##### ILoaderService
* `LoadStage(IContentData contentData)` has been deprecated, please call `LoadStage(string stageId)` instead.
* `LoadGoals(IStagedata stageData)`, please call `LoadGoal(string goalId, IGoalSequenceSavedData goalSequenceSavedData`.

##### IModifierData
* `Init(string guid, IModifierCategoryData modifierCategoryData)` has been deprecated, please call `Load(IModifierCategoryData modifierCategoryData)`

##### IModifierManager
* `IModifiable`s no longer registered to the `IModifierManager` on `StaticDataAdded` events.
* `IModifier`s no longer registered to the `IModifierManager` themselves, instead they are now registered to `IModifierManager` in `LoadContentAction` and `LoadStageAction`.
* constructor `ModifierManager(IStaticDataManager staticDataManager, IEventManager eventManager)` has been deprecated, please call `ModifierManager(IEventManager eventManager)` instead

##### IRarity
* `ICurrency` now contains `ITagData` and `IRarityData` members to hold tag and rarity information. While tags are optional, all `Currency` types must have a `Rarity`. As a result `ICurrencyData` now requires Ids for both tags and rarity. Sample `Rarity` assets can be found in the IdleKit-Example Data folder.
* The `EntitiesDatabase` now contains functionality to load `IRarityData` and `ITagData` in `EntitiesDatabase.Load()`. If using a custom loader process then `ITagData` and `IRarityData` assets must be loaded prior to other `Entities` as they may depend on them.

##### IRewardManager
* `IRewardManager` no longer listens to `StaticDataAdded` event. Instead, `IRewards` are now loaded and registered to `IRewardManager` in `LoadContentAction`.

##### IStaticDataManager
* `AddDataCollection(string[] ids, T[] data)` has been deprecated, please call `AddDataCollection(T[] data)` instead
* `AddDataCollection(string[] ids, object[] data, Type entityType)` has been deprecated, please call `AddDataCollection(T[] data)` instead
* `StaticDataAddedEvent` event is not used anymore in the IdleKit framework as IdleKit loads the entities with `ILoaderService` and registers them with their respective IServices directly.
