이전글 : https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=12066
다음글 : https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=30606
이전글에서도 말했다시피 만들려는 어플의 목적은 내가 사용하고 있는 모드에서의(바닐라 뿐만에 아닌 모든 모드) 레시피, 아이템, 연구에 관련한 모든 정보를 인 게임이 아니라 집 밖의 어느 곳에서도 간단히 폰만 가지고 확인할 수 있도록 하는게 어플의 목적임
또한 각 레시피, 아이템, 연구 정보는 서로가 서로를 링크하는 구조로 이루어져있어 관련된 정보를 손 쉽게 연속적으로 접근 할 수록 있도록 하는게 어플의 주 목적이라고 할 수 있음
레시피의 출력 정보는
생산아이템(이름+수량), 재료아이템(이름+수량), 제작시간 정보를 나타낼 것이고 그 레시피를 해금 시켜주는 연구, 레시피를 적용할 수 있는 생산 건물을 띄워줄 예정임
여기서 아이템을 선택한다면 그 아이템을 만들 수 있는 레시피 목록, 그 아이템으로 만들 수 있는 레시피 목록, 그 아이템 자체의 정보를 띄워줄 수 있는 창으로 링크 시켜 줄 것임
연구를 누르면 그 연구에 관한 정보가 뜨드록 링크가 될 것임
아이템의 출력 정보는 말 그대로 아이템에 관한 모든 정보가 뜨도록 할 것임
예를 들면 설치형 아이템이라면 사용하는 전력의 정보라던지, 벨트의 속도라던지, 발전기의 발전량이라던지 등등등
레시피와 마찬가지로 해당 아이템에 관련된 레시피의 정보가 링크 될 것임
연구의 출력 정보는 연구에 의해 해금되는 요소(레시피, 보너스), 선행 연구, 후행 연구 에 대한 정보를 표출하게 될 것임
레시피를 누르면 해당 레시피의 자세한 정보가 뜨도록 링크 될 것이고, 선후행 연구를 누르면 당연히 그에 관한 연구가 뜨게 되겠지
전체적인 모습은 모드 FNEI와 비슷함. 차이점은 관련 연구도 뜨게 할 것이다 정도?
이를 위해서는 레시피, 아이템, 연구의 정보들을 게임 밖으로 출력하게 하는 방법이 중요함.
이것을 어떻게 구현할까 고민했는데 helmod같은 모드에서는 설정정보를 문자열로 내보낼 수 있고 다시 그 문자열을 불러들여 설정을 적용할 수 있도록 해주는게 기억이 나더라고.
그래서 나도 마찬가지로 레시피등등의 정보를 문자열로 추출해주는 모드를 제작할까? 라는 생각을 처음에 했음
그런데 막상 그런 모드를 만들려니 gui까지 구현해야 하기도 하니 골찌가 아프기도 하고 아무리 생각해도 문자열이 너무 길어지게 될 것같아서 좀 난감하더라고. 그래서 아예 스크립트로 추출내는 방법이 있지 않을까 해서 찾아 보기 시작함
그리고 팩토리오 위키에서 가장 필요한 정보를 찾게 됨
와! 내가 딱 필요한 정보
실행해보니 이건 해금된 레시피들의 이름들을 파일로 저장하는 코드였음
사실 이걸 보기전에도 factorio API들을 뒤젹거려보기는 했지만 lua자체가 생소하기도 하고 프로토타입이니 뭐니 헷갈려서 감이 잘 안왔는데 저 예시 코드를 보니 감이 확 잡히더라고
가장 중요한건 game.write_file을 통해서 스크립트의 결과물을 파일로 저장할 수 있다는 사실이였음
채팅창에 해당 명령어를 입력하면..
짜잔! 파일로 추출에 성공하였다!
해당 출력물은 팩토리오의 로컬 폴더에 있는 script_output 폴더 안에 지정한 파일이름으로 생성이 됨
이로서 가장 걱정하던 문제는 해결 되었음. 모드를 직접 만들이 않아도 돼서 얼마나 다행인지 몰라
다음의 목적은 레시피 정보를 스크립트를 통해서 찾아내는 것이였음
이 문제는 생각보다 금방 해결 되었음
파일을 저장하기 위해 사용해었던 game.write_file에서 game이란 녀석이 결국 스크립팅에서 가장 중추가 되는 녀석이더라고
이 녀석의 API를 보니까 필요한 정보들에 접근하기 위한 모든 것들이 저 API에 존재했음
recipe, item, fluid, technology ㅗㅜㅑ...
이중에서 일단 가장 먼저 recipe 정보를 띄워보자 하였고 여기부터는 LuaRecipePrototype이라는 단서가 있으니까 해야할 방향은 잡혀있고 그 길을 따라가기만 하면 됐음
파일로 추출하기 전에 테스트 하는 작업
iron-gear-wheel이라는 recipe는
iron-plate 2개와 0.5초의 시간을 사용하여 iron-gear-wheel 1개를 생산한다
이런식으로 모든 레시피 정보를 JSON으로 내보내면 끝!
실제로는 저 정도 정보만 있는건 아니고 몇가지 정보를 더 포함해서 내보내주고 있음
JSON으로 만들어 주는 작업은 game.table_to_json이라는 유용한 함수가 있긴는 했지만 이게 아무대나 적용되는 것은 아니라서 대부분은 수동으로 포맷을 만들어줬음
아래는 해당 코드
/c function write_recipe(fn,recipe)
game.write_file(fn,'{',true)
game.write_file(fn,{"",'"name":"',recipe.name,'",'},true)
game.write_file(fn,{"",'"localised_name":"',recipe.localised_name,'",'},true)
game.write_file(fn,{"",'"category":"',recipe.category,'",'},true)
game.write_file(fn,{"",'"order":"',recipe.order,'",'},true)
game.write_file(fn,{"",'"group":"',recipe.group.name,'",'},true)
game.write_file(fn,{"",'"subgroup":"',recipe.subgroup.name,'",'},true)
game.write_file(fn,{"",'"main_product":',(recipe.main_product~=nil) and ('"'..recipe.main_product.name..'"') or "null",','},true)
game.write_file(fn,{"",'"energy":',recipe.energy,','},true)
game.write_file(fn,{"",'"ingredients":',game.table_to_json(recipe.ingredients),','},true)
game.write_file(fn,{"",'"products":',game.table_to_json(recipe.products)},true)
game.write_file(fn,{"",'}'},true)
end
local fn = "recipes.json"
local num = #game.recipe_prototypes
game.write_file(fn,'[')
for _,recipe in pairs(game.recipe_prototypes) do
write_recipe(fn,recipe)
num=num-1
if num~=0 then game.write_file(fn,',',true) end
end
game.write_file(fn,']',true)
이 코드를 채팅창에 복붙하면 script_output폴더에 recipes.json이라는 파일에 내용물이 저장되게 됨
바닐라 기준으로는 약 100KB의 텍스트 파일이 생성되고 밥스 모드로 적용했을 때는 500KB정도의 텍스트 파일이 생성 되는 것을 볼 수 있었음
저장된 파일을 열어보니 원하는 대로 잘 저장이 되었음
다만 아직은 레시피 이름만 한국어로 볼 수 있고 재료로 사용되거나 생산되는 아이템의 이름은 영어로 밖에 볼 수 없다는 문제점이 존재함
앞으로 item_prototypes를 추출해내면 번역된 이름을 얻을 수 있을거고 그때 해결이 되는 문제일 것이야
여기까지는 했으니 실제로 이걸 가지고 뭔가 볼 수 있어야 재미가 있겠지?
주어진 JSON 파일을 이용해서 레시피의 이름(영어 또는 한국어)을 입력하면 그 레시피에 대한 정보가 뜨도록 간단하게 짜 보았음
밥스모드를 적용하였을 때 추출한 JSON을 이용하였기 때문에 밥스 모드의 레시피가 잘 뜨는 것을 볼 수 있었음
아마 다음 제작기는 모든 정보를 다 추출하고 어플로 만들기 직전 단계에서 올리지 않을까 싶네
앞으로 할일
아이템/연구 정보 추출하기
레시피-아이템-연구 링크테이블 만들기
어플화
뭔진 모르겠지만 이과생 같으니 추천