# lionecs

Latest version **0.1.1** (published 2022-03-20) · MIT license · 0 weekly downloads

> **Deprecated.** This package is deprecated.

## Install

```sh
npm install lionecs
pnpm add lionecs
yarn add lionecs
bun add lionecs
```

## Health

**Score 10/100 (F)** — status: deprecated.

Negative: deprecated.

## Facts

| | |
|---|---|
| Version | 0.1.1 |
| Published | 2022-03-20 |
| First published | 2021-12-07 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 5 |
| Unpacked size | 76.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Leon Si <contact@leonzalion.com> |
| Maintainers | leonzalion |

## Links

- npm: https://www.npmjs.com/package/lionecs
- Repository: https://github.com/leonzalion/lionecs
- Homepage: https://github.com/leonzalion/lionecs#readme
- npm.io page: https://npm.io/package/lionecs

## Dependencies (5)

- [rfdc](https://npm.io/package/rfdc.md) ^1.3.0
- [immer](https://npm.io/package/immer.md) ^9.0.12
- [nanoid](https://npm.io/package/nanoid.md) ^3.3.1
- [just-extend](https://npm.io/package/just-extend.md) ^6.0.1
- [lion-architecture](https://npm.io/package/lion-architecture.md) ^1.0.5

## Recent versions

- 0.1.1 (latest) — 2022-03-20
- 0.1.0 — 2022-02-26
- 0.0.2 — 2021-12-22
- 0.0.1 — 2021-12-07

## README

# LionECS

## Installation

Install LionECS from npm using your favourite package manager (I recommend [pnpm](https://pnpm.io/)):

```bash
pnpm add lionecs
```

## Usage

```typescript
// components.ts

import type { Entity } from 'lionecs';
import { defComponent, defsToComponents } from 'lionecs';

export const Component = defsToComponents({
  name: defComponent<string>().name('name'),
  health: defComponent<number>().name('health'),
  inventory: defComponent<{ primary: Entity | null; secondary: Entity | null }>().name(
    'inventory'
  ),
  inventoryItem: defComponent<true>().name('inventoryItem'),
  damage: defComponent<number>().name('damage'),
});

// Avoids specifying `typeof Component` at every "type site" (the type equivalent of a call site)
export type Component = typeof Component;
```

```typescript
// entities.ts

import { Component } from './components.js';
import { useDefineEntities } from 'lionecs';

const defineEntities = useDefineEntities<Component>();

const GameEntity = defineEntities({
  player: [Component.health, Component.inventory, Component.name],
  enemy: [Component.health, Component.damage],
  weapon: [Component.inventoryItem, Component.name, Component.damage],
});

export type GameEntity = typeof GameEntity;
```

```typescript
import { createLionecs } from 'lionecs';
import { Component } from './components.js';
import type { TypedEntity } from 'lionecs';
import type { GameEntity } from './entities.js';

const ecs = createLionecs({ components: Component });
const p = ecs.useProxy();

// TypeScript IntelliSense works here!
const sword = ecs.entity<GameEntity['weapon']>({
  damage: 10,
  inventoryItem: true,
  name: 'MySword',
});

const enemy = ecs.entity<GameEntity['enemy']>({
  damage: 5,
  health: 50,
});

const player = ecs.entity<GameEntity['player']>({
  health: 100,
  inventory: {
    primary: sword,
    secondary: null,
  },
  name: 'Leon',
});

function attack({
  attacker,
  defender,
}: {
  attacker: TypedEntity<Component['damage']>;
  defender: TypedEntity<Component['health']>;
}) {
  // TypeScript IntelliSense also works here!
  p(defender).health -= p(attacker).damage;
}

attack({ attacker: enemy, defender: player });

console.log(ecs.get(player, Component.health)); // Outputs: 95

attack({ attacker: sword, defender: enemy });

// Equivalent to ecs.get(enemy, Component.health)
console.log(p(enemy).health); // Outputs: 40

function swapInventoryItems(entity: TypedEntity<Component['inventory']>) {
  const inventory = p(entity).inventory;
  [inventory.primary, inventory.secondary] = [inventory.secondary, inventory.primary];
}

swapInventoryItems(player);

console.log(p(player).inventory.primary); // Outputs: null
console.log(p(player).inventory.secondary === sword); // Outputs: true
```

---
_Source: https://npm.io/package/lionecs · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
