soma0sd

코딩 & 과학 & 교육

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_arrowsitp_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 ??
반응형
태그:

댓글

End of content

No more pages to load