# Core - 기반 추상화 계층

게임 엔진의 **확장 가능한 인터페이스**와 **기본 데이터 타입**을 정의하는 계층입니다.

## 📦 모듈 구성

### `system.rs`
- **`System` trait**: 모든 게임 로직 시스템이 구현해야 하는 인터페이스
- **`SystemId`**: 시스템 고유 식별자
- **`SystemContext`**: 시스템 실행 컨텍스트 (delta_time, entities, input 등)
- **`SystemError`**: 시스템 실행 중 발생하는 에러

### `component.rs`
- **`Component` trait**: 모든 컴포넌트가 구현해야 하는 인터페이스
- Entity에 부착되는 데이터 조각의 기본 인터페이스

### `entity.rs`
- **`Entity`**: Component들을 담는 컨테이너
- **`EntityId`**: 엔티티 고유 식별자
- TypeId 기반 Component 저장/조회 시스템

### `input.rs`
- **`InputState`**: 입력 상태를 저장하고 조회하는 순수 데이터 구조체
- 키보드/마우스 입력 Polling API 제공
- System들이 읽기 전용으로 접근

## 🎯 설계 철학

### 확장성 (Extensibility)
사용자가 `System`과 `Component` trait만 구현하면 엔진을 자유롭게 확장할 수 있습니다.

```rust
use moltrun::core::{System, SystemContext, SystemError};

struct MyCustomSystem;

impl System for MyCustomSystem {
    fn update(&mut self, context: &mut SystemContext) -> Result<(), SystemError> {
        // 커스텀 로직 구현
        Ok(())
    }
    // ...
}
```

### 추상화 (Abstraction)
구체적인 구현이 아닌 **인터페이스만** 정의합니다. 실제 구현체는 다른 계층(`components/`, `systems/`)에 위치합니다.

### 의존성 방향
모든 다른 계층이 `core/`를 참조하지만, `core/`는 최소한의 외부 의존성만 가집니다.

```
components/ ────┐
systems/    ────┤
runtime/    ────┼──→ core/
render/     ────┤
scene/      ────┘
```

## 📋 사용 예시

### Entity + Component
```rust
use moltrun::core::{Entity, EntityId};
use moltrun::components::Transform;

let mut entity = Entity::new(EntityId::new(1));
entity.add_component(Transform::default());

if let Some(transform) = entity.get_component::<Transform>() {
    // Transform 사용
}
```

### System 등록 및 입력 사용
```rust
use moltrun::runtime::World;
use moltrun::core::{System, SystemContext, SystemError};
use winit::keyboard::KeyCode;

struct MyCustomSystem;

impl System for MyCustomSystem {
    fn update(&mut self, context: &mut SystemContext) -> Result<(), SystemError> {
        // 입력 접근
        if context.input.is_key_down(KeyCode::KeyW) {
            // W 키가 눌려있을 때
        }
        Ok(())
    }
    
    fn as_any(&self) -> &dyn std::any::Any { self }
    fn as_any_mut(&mut self) -> &mut dyn std::any::Any { self }
}

let mut world = World::new();
world.register_system(MyCustomSystem)?;
```

## 🔗 관련 계층

- **`runtime/`**: `core/`의 인터페이스를 사용하여 실행 환경 구축
- **`components/`**: `Component` trait 구현체들
- **`systems/`**: `System` trait 구현체들 (미래 확장)
