나는이 질문이 MMO 나 디아블로와 같은 게임과 더 관련이 있다고 생각합니다.
몬스터가 백분율에 따라 다른 유형의 아이템을 떨어 뜨릴 수있는 드롭 테이블을 구현하기위한 일반적인 디자인은 무엇입니까? 항목 유형에 '백분율 가중치'사전을 갖는 가장 간단한 방법이 있지만 새 항목 유형을 도입하려는 경우 확장하기가 어렵습니다 (예 : D2 확장에 룬 및 새 클래스 항목이 포함 된 경우).
나는이 질문이 MMO 나 디아블로와 같은 게임과 더 관련이 있다고 생각합니다.
몬스터가 백분율에 따라 다른 유형의 아이템을 떨어 뜨릴 수있는 드롭 테이블을 구현하기위한 일반적인 디자인은 무엇입니까? 항목 유형에 '백분율 가중치'사전을 갖는 가장 간단한 방법이 있지만 새 항목 유형을 도입하려는 경우 확장하기가 어렵습니다 (예 : D2 확장에 룬 및 새 클래스 항목이 포함 된 경우).
답변:
내가 작업하고 있던 불량한 경우 드롭을 생성하기 위해 매우 유연한 데이터 중심 시스템을 구현했습니다. 나는 그것을 여기에 문서화했다 . 본질적으로 무작위로 선택된 여러 항목을 선택하기위한 작은 DSL입니다.
간단한 드롭은 다음과 같습니다.
1-10 copper coin
1에서 10 사이의 임의의 수의 구리 동전을 떨어 뜨린다 고 말합니다. 분기를 추가하면 상황이 더 유연 해집니다.
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
"중 하나"는 주어진 확률을 기반으로 하위 분기 중 하나를 선택한 다음이를 평가합니다. 방울은 하나 이상의 아이템을 떨어 뜨릴 수 있습니다 :
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
그러면 모든 하위 분기 를 평가 하여 확률에 대한 롤이 통과하면 해당 분기를 삭제합니다. 던전 및 플레이어 레벨에 따라 아이템을 선택하기위한 다른 지점도 있습니다.
이것들은 복잡해질 수 있기 때문에 명명 된 매크로를 정의 할 수 있습니다. 기본적으로 분기 식을 확장하고 여러 방울에서 재사용 할 수있는 함수입니다. 예를 들어, 모든 드워프가 같은 종류의 전리품을 떨어 뜨린 경우, 하나의 매크로를 만들어 거대한 드롭 테이블을 복사하여 붙여 넣는 대신 모든 종류의 몬스터에 사용할 수 있습니다.
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
여기에서 (coins)
, (any-weapon)
그리고 (any-armor)
모든 매크로 호출은 다음과 같습니다 :
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
차례로 다음과 같은 것을 호출합니다.
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
실제 프로그래밍 언어와 마찬가지로 드롭 표현식을 임의로 중첩 할 수 있습니다. 이것은 간단한 테이블 기반 접근 방식이 제공하지 않는 구성 가능성을 제공합니다.
모든 데이터 중심 시스템과 마찬가지로 복잡한 드롭을 구축하여 자신을 압도 할 수는 있지만 내 목표를 달성합니다.
이를 구현하는 C # 코드는 here 입니다.
Stendhal에서 전리품 테이블은 목록입니다. 각 항목에는 품목 이름, 최소 및 최대 수량 및 확률이 포함됩니다. 내부 구조는 우리가 생물체의 웹 페이지 에 표시하는 것과 매우 유사합니다 .
세계에 대해 잘 알고있는 게임 디자이너가 그러한 것들을 정의 할 수있는 것이 중요합니다. 즉, 프로그램 코드 수준에서 복잡한 논리를 이해하지 못하는 것입니다. 따라서 프로그램 코드에는 생물체와 아이템에 대한 정의가 없지만 elves.xml 또는 club.xml 과 같은 .xml 파일로 이동했습니다 . GUI 편집기가 있지만 대부분의 게임 디자이너는 .xml 파일을 직접 수정합니다.
생물과 아이템을 쉽게 확장 할 수 있도록 빌딩 블록 시스템을 사용합니다. "elf"또는 "archer elf"에는 프로그램 클래스가 없습니다. 그러나 "겁쟁이", "순찰대", "공격적", "아처", "치유 자"와 같은 행동 관련 클래스가 많이 있습니다. 디자이너는 프로그램 코드를 작성하지 않고 새로운 피조물이 해당 행동을 선택하도록 정의 할 수 있습니다. 예를 들어 "아처 엘프"를 만들려면 활로 엘프 스프라이트를 그리고 "공격적", "아처"로 정의하십시오. 그런 다음 레벨 및 유사한 속성을 정의하고 전리품 테이블에 멋진 아이템을 추가하십시오.
아이템의 경우 비슷한 접근 방식이 있지만 현재는 한 가지 동작으로 제한됩니다. 디자이너는 새 아이템을 추가하고 "ConsumableItem", "KeyItem"또는 "AttackItem", "Spell", "Scroll"과 같은 동작을 정의 할 수 있습니다. 로직을 프로그래밍해야합니다.
D & D 테이블 탑 게임에는 전리품 유형이라는 개념이 있습니다. 대부분의 몬스터는 하나 이상의 테이블에서 떨어지며이 테이블은 확장에서 업데이트 할 것입니다. 몬스터들은 여전히 "일반 65 %, 보석 10 %, 예술 15 %, 도구 10 %"를 떨어 뜨릴 것입니다.
예를 들어 보석에는 "1 보석 (25 %) 2 보석 (50 %) 5 보석 (75 %) 100 보석"을 반환하는 임의 범위의 슬롯이 있습니다. 특별한 룬 보석을 추가하려면 표를 "1 보석 (25 %) 2 보석 (50 %) 5 보석 (75 %) 100 보석 (95 %) 1 runegem"으로 업데이트하십시오.
그러나 다른 한편으로, 이미 가중치 가중치를 받았다면 확장에서 모든 몬스터 테이블을 업데이트하지 않는 이유는 무엇입니까? 이와 같은 테이블은 텍스처와 메시에 비해 페이로드가 적습니다. 또한 백분율을 100까지 늘릴 필요가 없습니다. 이는 단지 가정으로 가정 한 것이며 임의의 값을 생성하기 전에 실제 총계를 계산할 수 있습니다. 가중치가 120을 더하면 1-100 대신 1-120에서 값을 생성하십시오.
표면적으로 이것은 "가중 랜덤 선택"문제와 동일하게 보입니다.
각 이벤트에 상대 확률을 할당하고 추가 한 다음 해당 범위 내에서 임의의 숫자를 선택하여 원하는 이벤트를 결정하십시오.
동일한 시스템 인 100을 사용하여 백분율을 사용하는 것을 선호하더라도 물건을 추가하는 것이 얼마나 어려운지를 과대 평가하고 있습니다. 확장에 100 %가 있고 20 %를 더한 경우 모든 값을 (120/100)으로 나누면 총 100 %로 돌아갑니다.