mount & blade warband 모딩: 아이템 플래그
새로운 모듈 제작 프레임워크를 만들어서 배포하려면 디컴파일 기능을 탐재해야 합니다. 기존 시스템과 다른 방식의 모드 제작 시스템인데 이걸 사용하려면 기존 개발하던 모듈 시스템을 지워버리고 바닥부터 하라고 하면 아무도 안쓸테니까요. 기존 모듈시스템을 바꾸는 방식도 있겠지만, WRECK등 기존 모듈 시스템의 규칙을 바꾸거나 강화하는 경우까지 감안해서 해석하기 어렵습니다. 그래서 생각한 방법은 결국 동일한 문법을 가지는 결과물을 디컴파일 하는 방식으로 작업하려고 합니다.
프로그래밍은 Python 3을 기준으로 합니다.
각 요소의 의미와 아이템 플래그의 위치
item_kinds1.txt
를 보면 아이템 정의가 아래와 같은 형식으로 나열되어 있습니다.
itm_barbed_arrows Barbed_Arrows Barbed_Arrows 3 barbed_arrow 0 flying_missile 2305843009213693952 quiver_d 3458764513820540928 65541 1610612736 124 4398046511112 3.000000 70 0 0 0 0 0 0 0 95 30 258 0
0
0
가시 화살을 나타내는 컴파일된 코드입니다. 각 요소는 공백으로 구분합니다. 이전 글 "mount & blade warband 모드 개발: 아이템 코드 따라가기"에서 이 값들을 간접적으로 다뤘습니다. 여기서는 아이템 플래그가 있는 첫 줄만 다루도록 하겠습니다.
{아이템ID} {아이템 이름} {아이템 PL} {매쉬 수} {매쉬 이름1} {매쉬 슬롯1} {매쉬 이름2} {매쉬 슬롯2} {매쉬 이름3} {매쉬 슬롯3} {플래그} {동작} {가격} {변형} {무게} ...
분해
공백을 기준으로 값이 나눠져 있으니 str.split(패턴, 문자열)
을 통해서 쉽게 각 값을 리스트로 만들 수 있습니다. 의도적인지 모르겠지만 메쉬를 나타내는 값에 공백이 여러개라 생각같이 나뉘지는 않아서 정규표현식을 이용하기로 했습니다.
import re
compiled = """
itm_barbed_arrows Barbed_Arrows Barbed_Arrows 3 barbed_arrow 0 flying_missile 2305843009213693952 quiver_d 3458764513820540928 65541 1610612736 124 4398046511112 3.000000 70 0 0 0 0 0 0 0 95 30 258 0
0
0
"""
values = re.split(r" +", compiled.replace('\n', ' ').strip())
re.split(패턴, 문자열)
은 정규표현식을 사용한 패턴을 사용할 수 있도록 해줍니다.
플래그 코드
플래그를 포함한 무기의 속성들은 비트연산자를 이용해 계산한 뒤 10진법으로 변환한 값이 적혀있습니다. 즉 가시화살의 플래그 값인 65541은 16진수로 봐야 의미를 추정할 수 있습니다. hex(65541)
의 값은 0x10005
입니다.
모듈 시스템의 headers_items.py
을 참고하면 이 값은 itp_type_arrows
와 itp_merchandise
의 OR 연산값임을 알 수 있습니다.
itp_type_arrows: 0x000005
itp_merchandise: 0x010000
결과: 0x010005
이런 규칙을 통해 플래그는 16진수의 자릿수마다 하나의 속성을 부여할 수 있을 것으로 보입니다.
각 자릿수에 들어가는 속성
이 내용은 모드 편집 및 트윅을 위해 MORGH'S M&B WB/WFAS EDITOR를 사용할 때에도 활용할 수 있습니다.
0x01~0xFF는 아이템의 종류를 나타냅니다. 하나만 선택할 수 있습니다.
플래그 | 값 | 설명 |
---|---|---|
type_horse | 0x000000000000001 | 말 |
type_one_handed | 0x000000000000002 | 한손무기 |
type_polearm | 0x000000000000004 | 양손무기 |
type_arrows | 0x000000000000005 | 화살 |
type_bolts | 0x000000000000006 | 볼트 |
type_shield | 0x000000000000007 | 방패 |
type_bow | 0x000000000000008 | 활 |
type_crossbow | 0x000000000000009 | 석궁 |
type_thrown | 0x00000000000000a | 투척무기 |
type_goods | 0x00000000000000b | 상품과 음식 |
type_head_armor | 0x00000000000000c | 투구 |
type_body_armor | 0x00000000000000d | 상체갑옷 |
type_foot_armor | 0x00000000000000e | 하체갑옷 |
type_hand_armor | 0x00000000000000f | 장갑 |
type_pistol | 0x000000000000010 | 피스톨 |
type_musket | 0x000000000000011 | 머스켓 |
type_bullets | 0x000000000000012 | 탄약 |
type_animal | 0x000000000000013 | 동물 |
type_book | 0x000000000000014 | 책 |
0x100~0xF00는 행동과 아이템의 상호작용을 나타냅니다. 하나만 선택할 수 있습니다.
플래그 | 값 | 설명 |
---|---|---|
force_attach_left_hand | 0x000000000000100 | 강제로 왼손에 위치 |
force_attach_right_hand | 0x000000000000200 | 강제로 오른손에 위치 |
force_attach_left_forearm | 0x000000000000300 | 강제로 왼팔에 위치 |
attach_armature | 0x000000000000f00 | 뼈대에 부착 |
attachment_mask | 0x000000000000f00 | 얼굴에 부착 |
0x0001000~0xFFFF000는 보조속성입니다. 추정입니다만, 이 속성은 복수로 선택할 수 있습니다. 값이 1, 2, 4, 8이니 2진법으로 보면 각각 다른 자릿수거든요.
플래그 | 값 | 설명 |
---|---|---|
unique | 0x000000000001000 | 희귀함 |
always_loot | 0x000000000002000 | 적이 항상 드롭 |
no_parry | 0x000000000004000 | 패리 불가 |
default_ammo | 0x000000000008000 | 기본 탄약 |
merchandise | 0x000000000010000 | 상점 판매 |
wooden_attack | 0x000000000020000 | 목재 공격(소리) |
wooden_parry | 0x000000000040000 | 목재 패리(소리) |
food | 0x000000000080000 | 음식, 굿즈 전용 |
two_handed | 0x000000000200000 | 양손 파지 |
cant_reload_on_horseback | 0x000000000100000 | 말위에서 장전불가, 원거리 무기 전용 |
primary | 0x000000000400000 | 주무기 |
secondary | 0x000000000800000 | 보조무기 |
doesnt_cover_hair | 0x000000001000000 | 머리카락 가리지 않음 |
covers_legs | 0x000000001000000 | 하체 가림 |
can_penetrate_shield | 0x000000001000000 | 방패 관통 가능 |
consumable | 0x000000002000000 | 소모품 |
bonus_against_shield | 0x000000004000000 | 방패에 대한 보너스 |
penalty_with_shield | 0x000000008000000 | 방패 착용 불가 |
cant_use_on_horseback | 0x000000010000000 | 말 위에서 사용불가 |
civilian | 0x000000020000000 | 성에서 착용 가능 |
next_item_as_melee | 0x000000020000000 | 다음 무기는 근접(자벨린 등) |
fit_to_head | 0x000000040000000 | 머리에 맞춤 |
offset_lance | 0x000000040000000 | 장병무기의 한 끝을 잡음(랜스) |
covers_head | 0x000000080000000 | 머리를 가림 |
couchable | 0x000000080000000 | 차징 공격 가능(랜스) |
crush_through | 0x000000100000000 | 방어 관통 |
remove_item_on_use | 0x000000400000000 | 사용시 사라짐 |
unbalanced | 0x000000800000000 | 불안정함(공격 후 딜레이) |
covers_beard | 0x000001000000000 | 수염 가림 |
covers_hair | 0x000008000000000 | 머리카락 가림 |
no_pick_up_from_ground | 0x000002000000000 | 전장에서 줍기 불가 |
can_knock_down | 0x000004000000000 | 기절시킴 |
covers_hair_partially | 0x000080000000000 | 머리카락만 가림 |
force_show_body | 0x000010000000000 | 강제로 몸통 보임 |
force_show_left_hand | 0x000020000000000 | 강제로 왼손 보임 |
force_show_right_hand | 0x000040000000000 | 강제로 오른손 보임 |
extra_penetration | 0x000100000000000 | 추가 관통피해 |
cant_reload_while_moving | 0x000400000000000 | 이동 중 장전 불가, 원거리 무기 |
ignore_gravity | 0x000800000000000 | 중력 무시, 원거리 무기와 탄약 |
ignore_friction | 0x001000000000000 | 저항 무시, 원거리 무기와 탄약 |
cant_reload_while_moving_mounted | 0x010000000000000 | 말위에서 이동 중 장전불가 |
has_upper_stab | 0x020000000000000 | ?? |
disable_agent_sounds | 0x040000000000000 | 음성을 제외한 효과음 비활성화, 동물 등 |
kill_info_mask | 0x700000000000000 | ?? |
'종료한 프로젝트 > mount&blade(종료)' 카테고리의 다른 글
mount & blade 모딩: 아이템 플래그 (2) (0) | 2019.11.30 |
---|---|
mount & blade 모딩: 아이템 클래스의 구조 (0) | 2019.11.28 |
mount & blade warband 모드 개발: 아이템 코드 따라가기 (0) | 2019.11.26 |
mount & blade warband 모드 개발: WRECK, 향상된 컴파일러 키트 (0) | 2019.11.25 |
mount & blade warband 모드 개발: 모드 적용하기 (0) | 2019.11.24 |
댓글