Commit Graph

16 Commits

Author SHA1 Message Date
hypercross da84605b2f refactor: use ReadSingleton for GameState in RenderSystem 2026-07-18 21:24:11 +08:00
hypercross 910fd00a03 feat: add ReadComponent and ReadSingleton methods
Introduce read-only access methods that return copies of components
to avoid unnecessary modification marking during iteration.
2026-07-18 21:24:03 +08:00
hypercross f1eddc75ae feat: add deferred structural mutations and entity iterators
Implement deferred structural mutations (AddComponent, RemoveComponent,
DestroyEntity) to allow safe modification of the world during
iteration.

Additionally, introduce a new `EntityIterator` API providing zero-
allocation `ref struct` iterators (`Select<T1>`, `Select<T1, T2>`, etc.)
to support manual iteration with early-exit capabilities.

As part of these changes, component access via `GetComponent<T>` during
iteration now automatically marks components as modified.
2026-07-18 21:22:23 +08:00
hypercross 9aa2a71257 feat: add WorldSerializer for saving and loading world state 2026-07-18 21:07:05 +08:00
hypercross 0a28890f2c feat: implement game saving and loading in TicTacToe
- Add serialization support to `World`, `EntityAllocator`, and
  `SparseSet`
- Implement `SaveGame` and `LoadGame` functionality in the TicTacToe
  example
- Add ability to resume a game from a saved state
- Implement auto-save after every move in the game loop
2026-07-18 21:06:57 +08:00
hypercross a19861c080 feat: add TicTacToe example project
Implement a complete Tic-Tac-Toe game using OECS to demonstrate
ECS patterns, including:
- Command pattern for placing marks
- System groups for logical updates and rendering
- CSV loading for initial board state
- Reactivity logging for observing entity and component changes
2026-07-18 20:43:13 +08:00
hypercross dddddbdbd6 perf: cache hash code in QueryDescriptor
fix: notify change buffer when removing components in World

docs: add caution about structural changes during ForEach

fix: prevent multiple disposals in World
2026-07-18 20:13:25 +08:00
hypercross 6f9efc050b feat: add component validation and TryGetComponent
- Implement `TryGetComponent<T>` in `World` and `SparseSet<T>`
- Add validation to ensure `ForEach` type parameters match the
  `QueryDescriptor`
- Improve error handling in `SparseSet<T>.Get` to throw
  `InvalidOperationException`
- Use `GUID` instead of `FullName` for `QueryDescriptor` hash stability
2026-07-18 20:07:43 +08:00
hypercross 25789e7c9d fix: improve stability and add edge case tests
- Fix SparseSet resize logic to correctly initialize new slots
- Implement Equals and GetHashCode for QueryDescriptor
- Prevent collection modification exceptions in World.DestroyEntity
- Update CommandQueue to accumulate errors across drain cycles
- Add comprehensive edge case tests in EdgeCaseTests.cs
2026-07-18 19:58:23 +08:00
hypercross 8557fc864d feat: add singleton support to World
Introduces a mechanism to store and access singleton components on a
reserved entity. The singleton entity is automatically excluded from
all standard queries to prevent it from being processed like regular
entities.

- Added `SetSingleton`, `GetSingleton`, `HasSingleton`, and
  `RemoveSingleton` to `World`.
- Added `RegisterSingleton` to `EntityAllocator` to support the
  reserved entity.
- Updated `QueryExecutor` to skip the singleton entity during
  iteration.
- Added unit tests for singleton functionality.
2026-07-18 19:53:58 +08:00
hypercross 01eb5aa5f6 feat: add reactivity via change buffering and R3 observables 2026-07-18 19:50:31 +08:00
hypercross 48f3319615 feat: add relationship components and reverse indexing
Introduces a relationship system to allow entities to point to other
entities. Includes a `Relationship<TSelf, TTarget>` component and a
`RelationshipIndex` to enable efficient reverse lookups (finding all
sources pointing to a specific target).

The `World.DestroyEntity` method now performs cascading removals:
- Relationships where the entity is the source are removed.
- Relationships where the entity is the target are removed from their
  respective source entities.

Also adds MessagePack support to `Entity` and `Relationship`.
2026-07-18 19:42:59 +08:00
hypercross c5578d4412 feat: add deferred command queue system 2026-07-18 19:38:10 +08:00
hypercross e4afaafd02 feat: add query system and system execution logic
Introduces a complete query system for iterating over entities with
specific component combinations, including support for "with" and
"without" filters.

Also adds:
- `ISystem` and `ITickedSystem` interfaces for defining logic.
- `SystemGroup` for managing and running groups of systems.
- `QueryBuilder` for a fluent API to construct queries.
- `QueryExecutor` for high-performance iteration using ref parameters.
- `Tick` and `TickType` to support timed and logical updates.
2026-07-18 19:33:05 +08:00
hypercross 6739cf4ac9 docs: add ADR-012 and MessagePack serialization guidelines
- Update design.md with MessagePack component requirements
- Add ADR-012 to architecture.md regarding public type requirements
- Add MessagePackAnalyzer to OECS.csproj for compile-time validation
2026-07-18 19:07:22 +08:00
hypercross 34439e0f95 feat: initialize OECS project structure
Initializes the OECS repository with the core foundation, including:

- Entity management with 24-bit IDs and 8-bit versioning
- Sparse set-based component storage
- Entity allocation and recycling logic
- Core World API for entity and component lifecycle
- Project scaffolding for source and unit tests
- Design documentation and architecture decision records (ADRs)
2026-07-18 19:03:37 +08:00