게임 스타바운드의 세부항목들 | ||||
등장 종족 | 에이펙스 | 아비안 | 플로란 | 글리치 |
인간 | 하이로틀 | 노바키드 | 그외 종족 | |
세계관 | 환경 | 몬스터 | 마을 / 던전 | 아웃포스트 |
퀘스트 | 미션 | 문서(구판) | 등장인물 | |
아이템 | 블록 | 가구 | 자원 | 소모품 |
도구 | 무기 | 장비 / 패션 | 제작대 | |
그외 항목 | 식민지 건설 | 우주선 | 모드 / 모딩 | 테크 |
베타 테스트 | OST | 커맨드 | 플레이 팁 |
목차
1 모딩은 어렵지 않습니다.
스타바운드는 언어로 JSON 과 Lua를 사용합니다.
물론 일일이 스크립트를 짜서 새로운 아이템 등 을 만드는 건 어렵지만
단순히 데이터 파일의 숫자만 바꾸는 식으로도 충분히 모드를 만들어 즐길 수 있습니다.
2 모딩에 앞서
우선 텍스트 편집기가 필요합니다. 데이터를 읽는 면에서는 물론 수정까지 해야 되기 때문에 기존에 있는 메모장이나 워드로는 어렵습니다.
다음 중 하나를 받아보세요.
Windows
Linux
Mac OS
Windows,Linux,Mac OS 모두 가능
3 데이터 언팩
모딩을 하기 위해서 스타바운드의 데이터를 가져와야 합니다. 하지만 게임 데이터는 assets.pak의 형태로 묶여있기 때문에 이 파일을 풀어 주어야 합니다.
3.1 Windows의 경우
두 가지 방법이 있습니다.
3.1.1 asset_unpacker.exe 를 이용
/Starbound/win32/ 폴더에 가면 asset_unpacker.exe라는 프로그램이 있습니다. 더블클릭 시 실행이 되지 않을 겁니다. 실행 법은 다음과 같습니다.
1. 다운받은 텍스트 편집기를 실행합니다.
2. 다음을 입력합니다.
@echo off echo Unpacking ..\assets\packed.pak into ..\assets\unpacked\ echo This may take a long time. start /wait /min asset_unpacker.exe ..\assets\packed.pak ..\assets\unpacked echo Done. pause |
3. /Starbound/win32/ 폴더에 저장합니다. 이 때 주의할 점은 파일의 확장자를 .bat 으로 해야 합니다. .txt 로 저장하면 안 됩니다.
4. 위에서 저장한 bat 파일을 실행하면 언팩이 진행됩니다. 완료 후 /Starbound/assets/ 폴더에 가면 unpacked 라는 파일명으로 언팩이 돼있습니다.
3.1.2 ModpackHelper를 이용
1. 해당 링크로 가서 가장 최신버전의 ModpackHelper를 받습니다.
2. 압축을 /Starbound/giraffe_storage/mods/ 폴더에 풀어줍니다.
3. ModpackHelper를 실행해서 0을 선택한 후 완료가 될 때까지 기다립니다.
4. 완료 후 /Starbound/assets/ 폴더에 가면 언팩이 되어있습니다.
4 모딩
프로그래밍 언어를 배우지 않더라도 약간의 기능만 알면 다양한 모딩을 할 수 있습니다.
4.1 모드 폴더 만들기
새 폴더를 만듭니다.
다음은 어느 모드든 폴더 내에 있어야 할 파일들 입니다.
- 모든 모드 폴더에는 해당 폴더가 모드임을 알려주는 .modinfo 파일이 필요합니다.
텍스트 편집기로 다음양식에 맞추어 적습니다.
{ "name" : "(모드의 이름)", "version" : "(현 스타바운드 버전 ex) Beta v. Pleased Giraffe)", "path" : ".(이 부분은 /mods 폴더의 경로를 적습니다만, /mods 폴더에 모드를 넣을 것이므로 . 만 찍어둡시다.)", "author" : "(자신의 이름)" } |
확장자를 .modinfo 로 자신의 모드 폴더에 저장합니다.
- 폰트가 필요합니다.
unpacked 파일로 가서 hobo.ttf 파일을 가져와줍니다.
모드를 만들 준비가 다 됐습니다.
4.2 바닐라 파일 편집하기(기초)
위에서 언급했듯이 기존의 파일에서 값을 바꾸는 것만으로도 모드를 만들 수 있습니다.
예를 들어봅시다. 다음은 \unpacked\recipes\refinery\voxel1k.recipe 파일입니다.
{ "input" : [ { "item" : "voxel1k", "count" : 1 } ], "output" : { "item" : "money", "count" : 600 }, "groups" : [ "refinery" ] } |
"input"은 추출기(refinery)에 넣는 재료이며
"output"은 당연히 추출된 픽셀입니다.
"groups"은 해당 recipe의 범주를 결정합니다.
"count" : 600을 "count" : 1000로 바꾸어봅시다.
{ "input" : [ { "item" : "voxel1k", "count" : 1 } ], "output" : { "item" : "money", "count" : 1000 }, "groups" : [ "refinery" ] } |
위의 수정된 파일을 모드폴더에 넣으면 40%의 손실 없이 1K voxel을 분해할 수 있게 됩니다.
현재는 업데이트를 통해 복셀과 픽셀 전환시 손실이 없게 되었습니다. 그러니 1200으로 놀려서 창조경제를 실현
4.3 바닐라 파일 편집하기(op 문법 사용하기)
그러나 위와 같은 모딩은 흔히 지저분한 편집(Dirty Edit)이라 불리며 파일 채로 편집하여 집어넣기 때문에 다른 모드와 충돌 가능성이 높아 배포용으로는 적합하지 않습니다.
대신 "op" 기능을 사용함으로서 충돌 가능성을 줄일 수 있습니다. "op" 기능은 쉽게 말해 파일 채로 편집이 아닌, 파일 내부의 특정 열(스트링)만 편집할 수 있게 해주는 기능입니다.
"op" 기능을 사용하기 위해서는 .patch 파일이 필요합니다. 다시 말하자면 아무개.config 파일을 "op" 기능을 사용하여 수정하려면 아무개.config.patch 파일이 아무개.config 파일과 같은 폴더(경로)에 있어야 합니다.
"op" 문법으로 가능한 값들은 "replace", "test", "add", "remove", "move", "copy"가 있습니다.
“test”, “add”, “replace”는 “path”와 “value”를 정의 해줘야 합니다.
“remove”는 “path”만 정의하면 됩니다.
“move”와 “copy”는 “from”과 “path”를 정의 해줘야 합니다.
차근차근 알아가 봅시다.
다음을 공통 예시로 들겠습니다.
{ "defaultBlueprints" : { "tier1" : [ { "item" : "test1" }, { "item" : "test2" }, { "item" : "test3" }, { "item" : "test4" } ] } } |
4.3.1 "add"
[ { "op" : "add", "path" : "/defaultBlueprints/tier1/-", "value" : { "item" : "test5" } } ] | { "defaultBlueprints" : { "tier1" : [ { "item" : "test1" }, { "item" : "test2" }, { "item" : "test3" }, { "item" : "test4" }, { "item" : "test5" } ] } } |
[ { "op" : "add", "path" : "/defaultBlueprints/tier1/2", "value" : { "item" : "test5" } } ] | { "defaultBlueprints" : { "tier1" : [ { "item" : "test1" }, { "item" : "test2" }, { "item" : "test5" }, { "item" : "test3" }, { "item" : "test4" } ] } } |
4.3.2 "remove"
[ { "op" : "remove", "path" : "/defaultBlueprints/tier1/2", } ] | { "defaultBlueprints" : { "tier1" : [ { "item" : "test1" }, { "item" : "test2" }, { "item" : "test4" } ] } } |
4.3.3 "replace"
[ { "op" : "replace", "path" : "/defaultBlueprints/tier1/0/item", "value" : "replace1" } ] | { "defaultBlueprints" : { "tier1" : [ { "item" : "replace1" }, { "item" : "test2" }, { "item" : "test3" }, { "item" : "test4" } ] } } |
4.3.4 "move"와 "copy"
[ { "op" : "copy", "from" : "/defaultBlueprints/tier1", "path" : "/defaultBlueprints/tier2" } ] | { "defaultBlueprints" : { "tier1" : [ { "item" : "test1" }, { "item" : "test2" }, { "item" : "test3" }, { "item" : "test4" } ], "tier1" : [ { "item" : "test1" }, { "item" : "test2" }, { "item" : "test3" }, { "item" : "test4" } ] } } |
4.3.5 적용
위의 예시를 op 문법을 이용해 바꿔봅시다.
voxel1k.recipe.patch 파일을 만들어 다음과 같이 입력합니다.
[ { "op" : "replace", "path" : "/output", "value" : { "item" : "money", "count" : 1000 } } ] |
이 파일을 voxel1k.recipe 파일의 경로인 \recipes\refinery\에 맞추어 자신의 모드 폴더에 voxel1k.recipe.patch 로 저장을 하면 스타바운드 실행 시
{ "input" : [ { "item" : "voxel1k", "count" : 1 } ], "output" : { "item" : "money", "count" : 600 }, "groups" : [ "refinery" ] } |
이
{ "input" : [ { "item" : "voxel1k", "count" : 1 } ], "output" : { "item" : "money", "count" : 1000 }, "groups" : [ "refinery" ] } |
로 자동으로 바뀌어 적용이 됩니다.
4.4 바닐라를 넘어서
5 패킹
- 패킹이란 모드 폴더를 포함한 그 내부의 파일들을 하나의 파일로 묶어주는 것입니다. 아무개 모드 폴더를 패킹하면 아무개.modpack 이라는 하나의 파일이 됩니다.
- 굳이 패킹을 하지않고 모드 폴더를 그대로 \starbound\giraffe_storage\mods 폴더에 넣어주어도 적용이 됩니다만, 패킹을 하면 모드의 로딩 시간이 단축되고 배포 시 사용자가 압축을 풀 필요없이 옮기기만 하면 되기 때문에 모드 설치가 쉬워집니다.
패킹 방법은 다음과 같습니다.
1. 해당 링크로 가서 가장 최신버전의 ModpackHelper를 받습니다. 언팩을 하는 프로그램과 동일합니다.
2. 압축을 /Starbound/giraffe_storage/mods/ 폴더에 풀어줍니다.
3. ModpackHelper를 실행해서 1을 선택합니다. 제시되는 선택지 중 자신의 모드 폴더의 이름에 해당하는 번호를 선택합니다.
4. 그 폴더(/Starbound/giraffe_storage/mods/)에 모드 폴더이름.modpack 파일이 생성됩니다. 모드 폴더는 그대로 있으므로 스타바운드 실행 시 혼동되지 않게 \mods 폴더에서 빼줍시다.