View Source Changelog

v0.10.0 (2024-09-25)

Features

  • introduces Ecspanse.Snapshot to enable custom save and load functionalities.
    • use Ecspanse accepts now the :version option to ensure backwards compatibility when restoring entities and resources.
    • use Ecspanse.Component and use Ecspanse.Resource accept now the :export_filter option.
  • new guides section for save and load.

v0.9.0 (2024-03-30)

Breaking

  • removes Ecspanse.Resource.State in favor of Ecspanse.State functionality.

Replacing the old Ecspanse.Resource.State with Ecspanse.State

Creating a new state
defmodule Demo.States.Game do
  use Ecspanse.State, states: [:play, :paused], default: :play
end

Multiple states can be defined in the same way:

defmodule Demo.States.Area do
  use Ecspanse.State, states: [:dungeon, :market, :forrest], default: :forrest
end
Conditionally running systems

Old code:

Ecspanse.add_system(
  ecspanse_data,
  Demo.Systems.MoveHero,
  run_in_state: [:play]
)

New code:

Ecspanse.add_system(
  ecspanse_data,
  Demo.Systems.MoveHero,
  run_in_state: {Demo.States.Game, :play}
)
Getting and setting states

Old code:

{:ok, %Ecspanse.Resource.State{value: state}} = Ecspanse.Query.fetch_resource(Ecspanse.Resource.State)
Ecspanse.Command.update_resource!(Ecspanse.Resource.State, value: :paused)

New code:

:play == Demo.States.Game.get_state!()

# Attention! The system running this command must be synchronous.
:ok = Demo.States.Game.set_state!(:paused)
Listening to state changes
defmodule Demo.Systems.OnGamePaused do
  use Ecspanse.System, event_subscriptions: [Ecspanse.Event.StateTransition]

  def run(%Ecspanse.Event.StateTransition{module: Demo.States.Game, previous_state: _, current_state: :paused}) do
    # logic
  end

  def run(_event), do: :ok
end

Features

Improvements

v0.8.1 (2023-12-22)

Improvements

  • returns an explicit error message when trying to run queries or create events and the Ecspanse server is not running.
  • documentation improvements.

v0.8.0 (2023-11-14)

Improvements

  • refactor the Ecspanse.Projection to include the state of the projection
    • the projection result is now wraped in a Ecspanse.Projection{} struct, together with the projection state.
    • the Ecspanse.Projection.project/1 callback returns now the projection state as well as the projection result.

Breaking

v0.7.3 (2023-11-13)

Improvements

  • implement the Projection.run?/2 optional callback to run projections conditionally.

v0.7.2 (2023-11-05)

Improvements

v0.7.1 (2023-10-07)

Improvements

v0.7.0 (2023-10-05)

Breaking

Improvements

  • updating projections after all frame systems have run to return a consistent state.

v0.6.0 (2023-10-02)

Features

v0.5.0 (2023-09-28)

Features

v0.4.0 (2023-09-17)

Breaking

  • removes the automatically generated events: Ecspanse.Event.{ComponentCreated, ComponentUpdated, ComponentDeleted, ResourceCreated, ResourceUpdated, ResourceDeleted}. Use custom emitted events or short-lived components instead.

Improvements

  • improves performance for tagged components. The system loop now runs faster when dealing with tagged components.

v0.3.1 (2023-08-30)

Fixes

  • fixes a bug where events could be scheduled after they were batched for the current frame, and before the current events are cleared. Causing some events to be lost. Thanks to @andzdroid for identifying and documenting the issue.
  • fixes a bug where temporary timers would crash. Thanks to @holykol for finding and fixing the issue.

Features

  • imports Ecspanse.Query and Ecspanse.Command in all systems, so all the queries and commands are available without needing the respective module prefix.
  • imports Ecspanse in the setup module that use Ecspanse so the system scheduling functions are available without needing the module prefix.

v0.3.0 (2023-08-21)

Features

v0.2.1 (2023-08-20)

Fixes

  • batch all events only by batch_key to avoid race conditions for different events processed by the same system.

v0.2.0 (2023-08-18)

Breaking

  • use Ecspanse.Component.Timer and use Ecspanse.Event.Timer are now deprecated. Use use Ecspanse.Template.Component.Timer and use Ecspanse.Template.Event.Timer instead.

Features

v0.1.2 (2023-08-14)

Fixes

  • removes unneeded dependency plug_crypto
  • upgrades dependencies: credo, ex_doc, jason

v0.1.1 (2023-08-12)

Fixes

  • adds the missing project :package