Godot 엔진으로 개발된 오픈소스 턴제 RPG 예제인 godot-open-rpg는 전투 메커니즘 외에도 다양한 아이템과 장비 시스템을 포함하고 있다. 이 문서에서는 해당 시스템의 구조와 작동 방식, 그리고 게임 내에서 어떻게 활용되는지를 살펴본다.
아이템 관리 시스템 설계
게임 내 아이템은 src/common/inventory.gd 파일에 정의된 Inventory 클래스를 통해 관리된다. 이 클래스는 Godot의 Resource 기반으로 설계되어 데이터 저장 및 접근이 용이하다.
아이템 종류 정의
기본적으로 다음과 같은 아이템 유형이 지원된다:
enum ItemType {
KEY,
GOLD,
EXPLOSIVE,
FIRE_SPELL,
ICE_SPELL,
EARTH_SPELL
}
각각의 아이템은 대응하는 텍스처 리소스와 연결되어 있으며, 다음과 같이 미리 로드된다:
const TEXTURES := {
ItemType.KEY: preload("res://assets/items/key.atlastex"),
ItemType.GOLD: preload("res://assets/items/coin.atlastex"),
ItemType.EXPLOSIVE: preload("res://assets/items/bomb.atlastex"),
ItemType.FIRE_SPELL: preload("res://assets/items/wand_red.atlastex"),
ItemType.ICE_SPELL: preload("res://assets/items/wand_blue.atlastex"),
ItemType.EARTH_SPELL: preload("res://assets/items/wand_green.atlastex")
}
핵심 기능 구성
Inventory 클래스는 아래와 같은 주요 함수들을 제공한다:
- 아이템 추가:
insert(type: ItemType, quantity: int = 1) - 아이템 제거:
delete(type: ItemType, quantity: int = 1) - 보유 수량 확인:
count_of(type: ItemType) -> int - 아이콘 가져오기:
static func fetch_icon(type: ItemType) -> Texture - 상태 저장/복원:
persist(),load_state()
또한, 아이템 변경 시 on_item_update 신호를 발생시켜 UI 등 다른 컴포넌트가 반응할 수 있도록 한다.
실제 사용 사례
플레이어는 여러 경로를 통해 아이템을 획득하거나 사용할 수 있으며, 각 동작은 별도 스크립트에서 처리된다.
보물상자 및 수집품
treasure_chest_interaction.gd 및 pickup.gd 스크립트를 통해 상호작용 시 인벤토리에 아이템이 추가된다:
# 보물상자 상호작용 예시
if not reward_given:
var inv = Inventory.load_state()
inv.insert(reward_type, amount)
reward_given = true
소모성 아이템 및 퀘스트 요소
열쇠와 같은 특정 목적의 아이템은 다음과 같이 소모된다:
# 문 열기 로직
var player_inventory = Inventory.load_state()
if player_inventory.count_of(Inventory.ItemType.KEY) > 0:
player_inventory.delete(Inventory.ItemType.KEY, 1)
특수한 경우, 예를 들어 마법봉을 특정 위치에 배치해야 하는 퍼즐에서는 다음과 같은 코드가 사용된다:
# 마법봉 거치대 상호작용
var inventory = Inventory.load_state()
inventory.delete(required_item_id)
active_item_id = required_item_id
icon_renderer.texture = Inventory.fetch_icon(required_item_id)
전투력 강화 시스템
현재 구현된 장비 시스템은 간단하지만 캐릭터 능력치에 영향을 줄 수 있는 구조를 갖추고 있다. battler_stats.gd 파일에는 장비 착용 시 능력치가 변경될 수 있음을 암시하는 주석이 존재한다:
# 장비 착용 시 능력치 수정 적용
# 장비 해제 시 remove_modifier() 호출 필요
시스템 확장 가능성
기존 시스템은 새로운 아이템이나 고급 장비 시스템 도입에 유연하게 대응할 수 있도록 설계되었다.
새로운 아이템 추가 방법
기존 enum에 새로운 항목을 추가하고, TEXTURES 딕셔너리에 이미지를 등록하면 된다:
# inventory.gd 수정 예
enum ItemType { ..., POTION }
const TEXTURES := {
...,
ItemType.POTION: preload("res://assets/items/potion.atlastex")
}
향후 장비 시스템 개선 방향
Item클래스를 상속받는Gear클래스 생성하여 속성 부여- Battler 클래스에 장비 슬롯 및 관리 메서드 추가
- 강화, 마법부여 등의 고급 기능 구현
이러한 구조 덕분에 개발자는 간단한 수집 요소부터 복잡한 장비 시스템까지 점진적으로 구축할 수 있다.