Simaple

새 컴포넌트 추가하기

스킬 컴포넌트를 추가하는 방법에 대해 설명합니다.

시뮬레이션 환경을 구성하기 위해 코드를 작성하는 경우, 일반적으로 제일 많은 시간이 들어가는 지점은 스킬의 정의입니다. 스킬을 정의하기 위해서는 해당 스킬의 동작이 Component Class로 구현되어 있어야 합니다. 해당 동작이 보편적으로 게임에 등장하는 behavior라면 이미 정의된 class를 사용할 수 있지만, 해당 스킬이 굉장히 특징적이거나, 직업의 고유한 메커니즘을 적용받는다면 스킬을 직접 구현해야 합니다.

이 문서에서는, 이런 경우에 어떻게 스킬을 구현하는지 서술합니다.

About Component

Component class의 작성 예시를 살펴봅시다.

 
.. code-block:: python
 
## 1. Define State
class AttackSkillState(ReducerState):
    cooldown: Cooldown
    dynamics: Dynamics
 
class AttackSkillComponent(Component, InvalidatableCooldownTrait, UseSimpleAttackTrait):
    ## 2. Define constructor
    name: str
    damage: float
    hit: float
    cooldown: float = 0.0
    delay: float
 
    ## 3. Define state initializer
    def get_default_state(self):
        return {
            "cooldown": Cooldown(time_left=0),
        }
 
    ## 4. A reducer
    @reducer_method
    def elapse(self, time: float, state: AttackSkillState) -> tuple[AttackSkillComponent, list[Event]]:
        return self.elapse_simple_attack(time, state)
 
    @reducer_method
    def use(self, _: None, state: AttackSkillState) -> tuple[AttackSkillComponent, list[Event]]:
        return self.use_simple_attack(state)
 
    def _get_simple_damage_hit(self) -> tuple[float, float]:
        return self.damage, self.hit

Component는 크게 네 부분으로 이루어집니다.

먼저, Component가 사용할 State를 정의합니다. State는 ReducerState 를 상속받아야 하며, 이 상태가 이 스킬이 가질 수 있는 상태가 됩니다.

두번째로, Component의 생성자를 정의합니다. Component 는 pydantic.BaseModel 을 상속받기 때문에 pydantic.BaseModel 의 생성자 정의 방식을 활용하여 컴포넌트가 정의되기 위해 필요한 정보를 명시합니다. 여기에 명시한 필드가, Spec에 작성된 값을 해석할 때 사용됩니다.

세번째로, get_default_state 를 정의합니다. 이 메서드는 해당 스킬이 가지게 될 초기 상태를 정의합니다. 모든 Component 는 해당 메서드를 정의해야 하는데, 이는 Component에 정의된 Reducer들이 인자로 받아가는 Entity 가 존재하지 않을 때 초기값을 지정하여 전달해주기 위함입니다. 여기서 사용되는 key는 앞서 정의한 상태 AttackSkillState 의 변수명과 일치해야 합니다. 그렇지 않다면, 프로그램은 당신이 제공한 초기값이 어떤 항목에 해당하는지 찾을 수 없을 것입니다.

마지막으로, @reducer_method 로 장식된 메서드들이 정의됩니다. 이 함수들은 이 스킬이 가질 수 있는 동작을 정의합니다. 모든 동작은 stateless하게 발생하며, 초기 상태와 payload를 받아서 변경된 상태를 반환합니다. elapse 메서드는 두번째 인자로 state: AttackSkillState 를 받고 있습니다. 항상 첫번째 인자가 payload, 두 번째 인자가 state여야 합니다. 모든 리듀서는 (state, list[Event]) 를 반환해야 합니다. 시뮬레이션은 반환값을 바탕으로 상태를 변경하고, 제공된 이벤트를 바탕으로 데미지 계산이나 각종 로그를 생성합니다.

일반적으로 많이 사용되는 리듀서들은 Trait를 통해 편리하게 제공됩니다.

On this page