모딩 참고사이트 모음 링크

https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=22079


공식위키의 모딩 개요는 시작부터 너무 많은 정보를 알려주니까 좀 간단하게 최소한을 위해 필요한 것부터 순서대로 알려주겠음.

맨 밑에 아래 내용을 따라한 결과물을 압축해서 올려놨으니 그거 보면서 봐도 됨.



◆ 임의의 모드를 만들어서 팩토리오에 로딩시키기



팩토리오 사용자데이터 폴더에 가면 mods 폴더가 있는데,(없으면 saves, config, scenarios 폴더등과 나란한 위치에 하나 만들어줌)

그 안에 폴더를 만들어야 한다.

폴더 이름이 엄청 중요한데, 폴더이름은 나중에 바꾸기로 하고, 안에다가 info.json 파일을 만들어야 한다.

팩토리오는 mods폴더안에 폴더가 또 있고 그안에 info.json파일이 있으면, 포털에서 다운로드받은 모드(zip압축파일)가 아닌, 제작중인 모드로 인식하고 불러오려고 한다.

---info.json 파일 내용---------------------

{

"name": "my Example-mod1",

"version": "0.1",

"title": "내 예시 모드1",

"author": "팩갤",

"contact": "",

"homepage": "https://gall.dcinside.com/mgallery/board/lists?id=factorio",

"factorio_version": "1.0",

"dependencies": ["base >= 1.0"],

"description": "예시로 만든 모드입니다."

}

------------------------------------

info.json 구조 : https://wiki.factorio.com/Tutorial:Mod_structure#info.json

name키값은 lua코딩을 할 때, 모드를 호출하는것과 폴더이름에 사용되며,

영어대소문자(Aa), 띄어쓰기( ), 숫자(123), 대시기호(-)로만 지어야한다(관련 공식문서는 없는듯)

언더스코어(_)문자는 버전과 이름을 구분짓거나 모드폴더를 lua코드에서 호출하는 특수문자로 사용되기 때문에 특별히 허가되지 않는다.


title은 한글 특문 등등 멋대로 지어도 됨. 대신에 한글등 특문을 넣으려면 info.json 파일이나 lua파일 등등은 UTF-8 (no BOM버전, Byte Order Mark 없는 기본버전) 인코딩으로 작성해야함.


그럼 아무 폴더나 만들어서 info.json을 넣고 팩토리오를 실행시키면


폴더이름을 anyname이라고 짓고 실행시켜본건데, 폴더이름과 모드이름이 칼같이 매칭이 안되면 에러가 뜬다. 어? 소문자 해도 된다고?

저거 뻥이다. 대소문자 구분해야한다. 이름을 소문자로 짓고 폴더이름 대문자로 하면 에러나더라.




◆ 모드 내용물 만들기 - 프로토타입 만들기


참고 : 제목을 프로토타입 만들기를 해놨는데, 프로토타입의 프로토타입(type, class)은 못바꾼다. 무슨 말이냐 이거. 아무튼 그렇다. 하드코딩되어있다. 그치만 어떤 아이템의 프로토타입(name)은 모드를 통해서 새로 만들거나 변경할 수 있다. 프로토타입을 만든다 라고 하면 type을 만드는게 아니라 name을 만든다고 보면됨. 아무튼 나중에 코딩 좀 더 하다보면 알게됨...


그 다음에 모드에 넣을 거의 필수인 파일은

data.lua, control.lua (둘 중 하나 혹은 둘 다) 정도다. 이 파일 둘다 없어도 되지만 그러면 모드를 만드는 이유가 없음. 아님 번역모드 만들거나? 시나리오만 넣거나?

들어가는 기본파일 목록은 여기 있다. : https://wiki.factorio.com/Tutorial:Mod_structure#Mod_folder_and_file_structure


control.lua는 로직을 짜야하기 때문에 어려운건 치우고 프로토타입 변형만 우선 넣어보자.

프로토타입을 변형하려면 data.lua가 있어야함

그리고 그 안에 갑옷을 추가하는 예제가 있다.

갑옷예제 : https://wiki.factorio.com/Tutorial:Modding_tutorial/Gangsir#Prototype_creation

item.lua를 만들고 require('item')을 써서 서브lua를 불러오는 식으로 정리를 하면서 만들게끔 유도하고 있는데, 그렇게 해도되고, 안하고 걍 data.lua에 죄다 적어넣어도 그만이다.


아무튼 이제 갑옷 예제의 내용을 한줄한줄 뜯어서 설명해주겠다.

링크의 갑옷예제 코드를 같이 보면서 보자.



- 1 -

local fireArmor = table.deepcopy(data.raw["armor"]["heavy-armor"])

table.deepcopy는 lua특성상, table1 = table2 같은 식으로 table을 = 기호를 통해서 대입한다고 해주면 table의 메모리좌표값(c언어 배웠다면, 이건 포인터임.)만 대입되고 새로 만든 table1 내부의 데이터들은 원본 table2의 데이터를 참조하거나 변경시키기 때문에 완전히 복제하려면 deepcopy를 써야한다.

data는 data.lua를 로딩할 때 사용할 수 있는 전역변수이고, data.raw는 프로토타입 저장소인데 일단 그냥 불러오면 팩토리오 바닐라에서 뭐든지 찾고본다.

armor는 프로토타입 이름이고, 프로토타입들은 위키의 Data.raw 페이지에 나열되있음.

: https://wiki.factorio.com/Data.raw#armor

프로토타입 자체의 내용은 변형할 수 없고 정해진것만 완전히 따라가야하는데, 무엇이 정해져있는지는

위 링크에서 armor 눌러보던가 https://wiki.factorio.com/Prototype/Armor 눌르면 가지는 곳 가서보면

정의된 키 값들이 있다. armor 프로토타입에는 이 키값들만 쓸 수 있는거다. 키값이 받는 값 형식도 칼같이 맞춰줘야함.

너 맘대로 underwear, pants같은 프로토타입을 새로만들어 줄 순 없고, armor프로토타입안에 새로운 키값을 추가해줄 수도 없다. 하드코딩되어있어... 못바꿔...


heavy-armor는 armor프로토타입으로 만들어진 아이템의 이름이다. 이미 만들어진게 있으니 복사해오는 것.


도대체 무슨 내용이 복사되어오는거지? 하고 궁금하다면, 팩토리오 설치폴더의 data/base/prototypes/item/demo-armor.lua 파일을 열어서 heavy-armor문자열 검색을 해보면, 바닐라에 헤비아머가 어떻게 만들어져있는지 볼 수 있다.

바닐라의 base, core폴더는 파일내용검색을 통해서 자주 찾아보게 되고, 이것저것 참고할게 많다.



- 2 -

base 원본파일과 위키의 armor프로토타입 페이지를 참고해봤으면 갑옷예제에 fireArmor 로컬 테이블의 값을 몇가지 뜯어고치는 내용이 이해가 갈거임.

fireArmor.icon이라고 예제에선 정의되지 않은 내용을 불러오는게 보이는데, 원본에 가보면,

icon = "__base__/graphics/icons/heavy-armor.png", 이라고 되어있다. deepcopy해왔으니 이 문자열 값도 복사해온거다.

여기서 __base__ 라는게 있는데, 이건 아주 중요한 디렉토리 참조 표현방법이다. __모드이름__ 으로 문자열 표현을 하면, 해당 모드 내부의 폴더로 찾아가는거다.

만약 지금 만드는 my Example-mod1 모드의 그림파일을 불러오고 싶다면,

icon = "__my Example-mod1__/someicon.png",

이렇게 하면된다. 띄어쓰기 신경쓰지말자. 어차피 문자열이라 띄어쓰기 넣어도 됨.



내맘대로 일단 아이콘을 더럽혀서 someicon.png로 저장해보았다.



- 3 -

recipe 역시 어디서 복제해오는데, 팩토리오 설치 폴더의 base/prototypes/recipe/demo-recipe.lua 안에서 찾을 수 있다. 어떻게 찾는지는 파일내용검색...

enabled는 연구가 아무것도 안되었어도 쓸 수 있는가? 하는 불리언값이고,

name은 내부이름이다. result는 이 레시피를 사용했을 때 등장하는 아이템 이름인데, 레시피 이름과 아이템 이름이 같을 필요는 없다.

result 이름은 위에 fireArmor.name = "fire-armor"에서 정해준 것이고, recipe.name 이름은 지금 결정되려는 것.



- 4 -

data:extend{fireArmor,recipe}

로컬 테이블 값으로 저장된 휘발성 데이터인 두 fireArmor, recipe 테이블값을 드디어 프로토타입에 등록해주는 함수다.

불러오는 순서는 recipe에서 fireArmor를 참조하니 저게 맞는거 같긴한데 recipe, fireArmor 둘이 등록 순서가 바뀌어도 상관없는 것 같다.



내용을 만들었으면 팩토리오 한번 켜보자.

이렇게 추가됨.




◆ 현지화 문자열 추가하기



자 그럼 이제 이름이 거슬린다. Unknown key라고 하시는데,

갑옷예제의 경우 : https://wiki.factorio.com/Tutorial:Modding_tutorial/Gangsir#Locale

현지화 개요 : https://wiki.factorio.com/Tutorial:Localisation

이걸 볼 차례다.


모드 폴더안에 locale 폴더를 만들고 그안에 en폴더와 ko폴더를 만들고

각각 언어폴더 밑에 확장자만 cfg로 아무이름으로 anyname.cfg 파일을 만든다. 한글의 경우 역시 UTF-8 이어야함.

갑옷 예제의 내용대로 __my Example-mod1__/locale/en/anyname.cfg 는 집어넣고,

__my Example-mod1__/locale/ko/anyname.cfg는 난 이렇게 함.

키값=문자열 에서 키값하고 =문자 사이는 절대로 띄우면 안된다. =하고 문자열도 붙여써야 문자열 앞에 공백이 안들어간다. 줄바꿈은 \n(원화문자n)으로 함.

특별한 곳에 표시하는 글귀가 아니라면 왠만하면 https://wiki.factorio.com/Rich_text 이것도 쓸 수 있다.

----------------------------

[item-name]

fire-armor=불아머


[item-description]

fire-armor=더워보이고 낙서가 되있어.

----------------------------

그리고 팩토리오를 껐다켜보면,


아이템이 추가된걸 볼 수 있다.


갑옷예제에는 저 불아머를 입고 달리면 불이 붙는게 있는데,

https://wiki.factorio.com/Tutorial:Modding_tutorial/Gangsir#The_control_scripting

control.lua는 이 예제보고 혼자 따라해보던가 다음에 하기로 하고, (설명할게 너무 많기 때문에)

오늘은 data.lua 기초만.


참고로, 저 현지화 문자열, 다른 모드에서 만들어진 아이템 명칭도 덮어쓸 수 있다.

어떤 영어로만 된 모드가 있어서 꽤 맘에드는데, 그 사람의 모드 제작 작업에 딴죽을 걸 수 없다면, 번역전용 모드를 locale 폴더만 포함해서 만들 수가 있다.




◆ 모드 zip 압축하는 방법



아무튼 머나먼 미래에 모드를 모드포털에 배포할 일이 생길 수 있는데, 그때를 위해, 혹은 포털에 올리기 민망한 내용을 포함하고 있거나(??) 임시로 개인에게만 공유하기 위해 모드폴더를 압축하는 방법을 알려드림.


압축프로그램 뭘 쓰냐에 따라 다르지만 압축파일은 최상단 경로에 단 하나의 폴더를 가지고 있어야하고, 종종 압축프로그램이 지딴엔 스마트하게 압축한다고 폴더가 하나면 그 폴더 제끼고 내용물만 압축하는 경우가 있는데, 그렇게 하면 안됨.

그리고 압축파일의 이름은 info.json에서 정해준 버전 넘버를 달아줘야한다. 모드이름_숫자.숫자.숫자


압축파일 내부의 이 폴더구조 유지해주는 일은 정말로 정말로 중요하다.

정말 정말 정말 중요 중요 중요 하다.


배포할게 아니라면 굳이 압축해서 보관할 이유는 없고, 폴더 상태 그대로 가지고 있으면 된다.

내 경우는 mods폴더안에 폴더 하나 더 만들고 그안에 제작중인 모드폴더를 집어넣어버려서 끈다.




아니면 mod-list.json 안에 자동으로 리스트가 생성되면, 게임 내 모드 메뉴에서 체크를 해제해서 끌 수도 있다.

근데 개발중인 상태라면 저거 체크 건들지 말고 그냥 압축 풀어진 폴더째로 다른데다 넣었다뺐다 하는게 나은거 같음... 개인 취향이지만.


참고용 my Example-mod1_0.1.0.zip 공유.

: https://drive.google.com/u/0/uc?id=1tTm_VLsgD2C34PjPd3IqeANlzYr6EX6I&export=download