soma0sd

코딩 & 과학 & 교육

mount & blade warband 모드 개발: 아이템 코드 따라가기

반응형

파일: 모듈 시스템에서 모드로

기본적으로 배포하는 모듈 시스템에서 module_items.py으로 정의한 아이템은 process_items.py를 거쳐 item_kinds1.txt가 됩니다.

아이템 정보가 모듈시스템에서 게임모드가 되는 과정(파일)

정보: 모드에서 모듈 시스템으로

제 취향의 방식으로 추적하는 순서를 그대로 따릅니다.

헤더

네이티브의 item_kinds1.txt는 다음 내용으로 시작합니다.

itemsfile version 3
620

이것을 기록하는 process_items.py에는 다음 내용이 있습니다.

def write_items(variable_list,variable_uses,tag_uses,quick_strings):
  itemkinds_file_name = export_dir + "item_kinds1.txt"
  ofile = open(itemkinds_file_name,"w")
  ofile.write("itemsfile version 3\n")
  ofile.write("%d\n"%len(items))
  # ...
  ofile.close()

즉, itemsfile version 3는 기록 형식을 지정하는 것으로 추정할 수 있고, 아랫줄 620은 전체 아이템의 수를 나타냅니다.

아이템 정의

헤더부분을 넘어가면 다음부터는 아이템 정의가 이어집니다.

ofile.write(" itm_%s %s %s %d " % (
  convert_to_identifier(item[0]),
  replace_spaces(item[1]),
  replace_spaces(item[1]),
  len(item[2])
  )
)

아이템을 정의하는 첫 부분입니다. module_items.py의 주석을 살펴보니 처음 문자열은 itm_으로 시작하는 아이템의 ID로 사용하는 문자열이고, 두번째와 세번째는 명칭을 나타내는 듯 합니다. 반복의 이유를 알 수 없네요. 네 번째는 사용하는 매쉬의 갯수 입니다.

item_variations = item[2]
for item_variation in item_variations:
  ofile.write(" %s %d "%(item_variation[0],item_variation[1]))

이렇게 리소스 파일에서 가져온 매쉬의 이름과 매쉬가 사용되는 상황을 의미하는 코드쌍을 열거합니다.

아이템 스펙

 ofile.write(" %d %d %d %d %f %d %d %d %d %d %d %d %d %d %d %d %d\n" % (
  item[3], # 아이템 플래그 (종류)
  item[4], # 사용할 동작
  item[5], # 아이템 가치 (가격)
  item[7], # 가능한 변형 (무거운, 가벼운, 강한 등)
  get_weight(item[6]),
  get_abundance(item[6]),                  
  get_head_armor(item[6]),
  get_body_armor(item[6]),
  get_leg_armor(item[6]),
  get_difficulty(item[6]),
  get_hit_points(item[6]),
  get_speed_rating(item[6]),
  get_missile_speed(item[6]),
  get_weapon_length(item[6]),
  get_max_ammo(item[6]),
  get_thrust_damage(item[6]),
  get_swing_damage(item[6]),
  )
)

이번에도 module_items.py의 주석을 참고했습니다. 아이템 스펙나열이 끝나면 다음 줄로 넘어갑니다.

트리거와 팩션

트리거는 특정 사건과 아이템을 연결할 때 사용합니다. 퀘스트에서 또 만날듯한 속성이네요. 팩션은 특정 문화권을 가진 상인들만 판매하도록 설정하는 것입니다.

if (len(item) > 9):
  ofile.write(" %d\n"%(len(item[9])))
  for item_faction in item[9]:
    ofile.write(" %d"%item_faction)
  ofile.write("\n")
else:
  ofile.write(" 0\n")

여기서는 판매 가능한 팩션을 나열하고 다음 줄로 넘어갑니다.

save_simple_triggers(ofile,trigger_list, variable_list,variable_uses,tag_uses,quick_strings)

def save_simple_triggers(ofile,triggers,variable_list, variable_uses,tag_uses,quick_strings):
  ofile.write("%d\n"%len(triggers))
  for trigger in triggers:
    ofile.write("%f "%(trigger[0]))
    save_statement_block(ofile,0,1,trigger[1]  , variable_list, variable_uses,tag_uses,quick_strings)
    ofile.write("\n")
  ofile.write("\n")

트리거를 나열하는 함수는 process_operations.py에 정의되어 있습니다. 트리거에 대한 내용은 나중에 중급자 코스 들어갈때 파보도록 하겠습니다.

여담

아이템 이름 번역

아이템 이름의 번역은 모드/languages/ko/item kinds.csv에서 itm_시작하는 아이템 코드를 기준으로 이루어집니다.

itm_horse_meat|말고기
itm_horse_meat_pl|말고기
itm_practice_sword|훈련용 검
itm_practice_sword_pl|훈련용 검
...

import *

from process_common import *
from header_common import *
from header_operations import *

모듈 시스템의 임포트는 다 이딴 식이라 인텔 센스도 정의 추적기도 동작하지 않아서 심하게 애먹었습니다. 착하고 파이소닉한 여러분들은 절대 이런 짓을 안했으면 합니다.

반응형
태그:

댓글

End of content

No more pages to load