게임 한글화 ⚙️

월드 오브 호러 모딩 가이드

ꓖemini 2022. 2. 23. 14:37

※필독

2023.10: 사실상 관리가 안 되고 있는 글입니다. 정식 출시 이후 모딩 방법에 대해서는 다른 분이 쓰신 가이드 글을 참고해 주세요:

https://gall.dcinside.com/mgallery/board/view/?id=worldofhorror&no=697&exception_mode=recommend&page=1

 

2022.10.30: 게임이 0.9.9 버전으로 업데이트 되면서 아마 모딩 부분에도 많은 변화가 생겼을 겁니다. 기존 가이드가 제대로 적용되지 않을 가능성이 높으니 기다려 주세요

 

 

월드 오브 호러 갤러리에 작성한 글에서 약간 설명 덧붙이고 추가로 색 입힌 버전입니다

모드 만들고 싶은데 혹시 도움 필요하시면 연락 댓글 남겨 주세요

시스템 쪽으로는 최대한 도와드리겠습니다!

 

월드 오브 호러는 기본적으로 모딩을 지원하는데, 이를 통해 유저가 창작한 커스텀 이벤트 / 미스터리 / 적 / 캐릭터 를 추가할 수 있습니다.

비록 기능은 조금 제한되어 있으나, 겜에 컨텐츠가 부족해지면 직접 만드는 수밖에요...

 

 

0. 모드 추가 방법 (미스터리, 캐릭터 제외)

공식 가이드는 %localappdata% > wohgame으로 들어가 폴더를 만들면 된다...고 하는데 그냥 게임 설치된 폴더에다 만들어도 잘만 인식됩니다

둘 중 편한 쪽에다가 하시면 돼요

 

게임이 읽을 수 있는 폴더명은 custom, sandbox, test 이렇게 세 가지인데, 왠만하면 custom으로 사용할 것을 추천합니다.

버그겜답게 custom 폴더가 없거나, 있어도 그 안에 모드가 없으면 sandbox나 test를 불러올 때 게임이 튕기거든요

 

아무튼 폴더를 만든 다음에는 모드 파일을 이곳에다 집어넣으면 끝입니다

미스터리와 캐릭터의 경우는 불러오는 경로가 다른데, 각각 게임 폴더 내의 mystery / character 폴더에다 넣어 주면 됩니다

 

불러온 다음에는 메인 화면의 모드를 눌러 custom, sandbox, test 중 어떤 폴더를 적용할 건지 선택할 수 있습니다

 

1. 커스텀 이벤트

월드 오브 호러의 커스텀 이벤트는 선택지를 최대 3개까지 지원하며, 각각 다른 능력치를 체크해 성공/실패 보상을 줄 수 있습니다

속성이나 내용은 제일 많은데, 오히려 그림 그릴 필요가 없어서 접근 난이도는 가장 쉽지 않을까 싶네요

아래는 선택지가 하나인 제일 간단한 유형의 이벤트 예시입니다

[event]

name="수족관"

location="mansion"

author="panstasz"

contact="@panstasz"

flavor="어느 한 방에서, 당신은 점액질로 뒤덮인 거대한 수족관을 발견했다. 물은 뿌옇지만, 분명 안에 무언가가 도사리고 있는 것이 틀림없다."

options="1"

 

optiona="가까이서 살펴본다"

testa="perception"

successa="묘한 수질에도 불구하고, 물고기는 느긋하게 물 속을 거닐고 있다. 당신은 이곳에 오래 있으면 안 되겠다는 느낌을 받고 슬그머니 물러선다."

winprizea="experience"

winnumbera="6"

failurea="이 수족관은 무언가 이상하다. 물고기들에게 달려 있으면 안 될 것들이 달려 있다. 두 번째 꼬리라던가, 수많은 지느러미라던가... 인간 얼굴이."

failprizea="reason"

failnumbera="-2"

읽어 보면 알겠지만 인지 체크를 돌려서 성공하면 경험치 +6, 실패하면 이성 -2를 받는 이벤트죠

또 제일 첫 줄은 [event]로 시작해야 하고, 그 아래로는 속성="내용"의 형식으로 진행되는 것도 확인할 수 있습니다

 

이제 아래로는 커스텀 이벤트에 들어갈 수 있는 속성과 들어가야 하는 내용, 각각의 기능을 나열하겠습니다

[event] 파일의 첫번째 줄을 이걸로 시작해야 커스텀 이벤트로 인식됩니다

 

name: 이벤트명

 

location: 이벤트가 발생하는 장소

global / downtown / school / hospital / seaside / forest / mansion / village / apartment / ithotu / athyola / gozu / atorasu / ygothaeg / schoolhospital / seasideforest

위 16개 중 하나를 골라서 내용에다 집어넣으면 되고, global은 장소 상관 없이 발생하는 이벤트, downtown~apartement는 각각의 장소에서만 발생, schoolhospital과 seasideforest는 이름 그대로 두 장소 (학교+병원 / 해안가+숲)에서 발생할 수 있는 이벤트며 ithotu~ygothaeg는 해당 고대신이 선택됐을 때 발생하는 이벤트

전령은 최근에 추가된 거라 따로 추가할 수가 없는 듯 합니다

 

author: 제작자명. 이벤트 화면에서 제작: XXX의 형태로 표시됨

contact: 모드 화면에서만 표시되는 제작자명

 

flavor: 첫 이벤트 화면에 나타나는 설명글.

 

options: (1 / 2 / 3) - 1이면 선택지를 1개, 3이면 선택지를 3개, 그 외의 경우에는 선택지를 2개 출력합니다

 

optiona: 선택지 버튼에 출력되는 문자

 

testa: 체크할 항목

strength / dexerity / perception / knowledge / charisma / luck / story / funds1 / funds2

위의 9가지 중 하나를 고를 수 있으며, 따로 값을 안 적으면 story로 설정됩니다

story면 무조건 통과, funds1/2면 자금 1/2 이상일 때 통과시킨 다음 자금 -1/-2

나머지는 해당 능력치로 2d6을 굴려서 성공 여부를 판정합니다

 

successa: testa 성공시 출력되는 문자

winprizea: 성공시 주는 보상 종류. 일부 값은 winnumbera를 필요로 합니다

stamina / reason / trigger_event / trigger_enemy / doom / experience / funds / curse / injury / item / itempool / spell / ally

내용에 들어갈 수 있는 값은 위의 13종류가 있으며, 각각 다음과 같은 기능을 합니다:

 

stamina / reason / doom / experience / funds: 활력 / 이성 / 파멸 / 경험치 / 자금을 winnumbera 값만큼 변동

trigger_event: winnumbera 값의 이벤트를 발동

trigger_enemy: winnumbera 값의 적과 조우, 전투 발동. (경로1\경로2\커스텀적.ito 같은 식으로 커스텀 적과도 연계할 수 있습니다)

curse: 무작위 저주 획득

injury: 무작위 부상 획득

item: winnumbera에 적힌 아이템 획득

itempool: winnumbera의 아이템 분류 중 무작위 아이템 획득

spell: 무작위 주문 획득

ally: 무작위 동료 획득

 

winnumbera: winprizea에서 지정한 보상의 양. 자세한 건 위의 winprizea 를 참고 바랍니다

 

extra_winprizea: winprizea와 함께 추가로 줄 수 있는 보상 종류.

stamina / reason / doom / experience / ending_trigger

내용에 들어갈 수 있는 값으로는 위의 5종이 있으며, winprizea에 비하면 종류가 적으나 특이사항으로 ending_trigger가 있습니다

stamina / reason / doom / experience: 활력 / 이성 / 파멸 / 경험치를 extra_winnumbera 값만큼 변동

ending_trigger: mystery_end_choice 값을 extra_winnumbera의 값으로 변화시킴

아래에서 자세히 얘기하겠지만 미스터리와 연동할 때 이 ending_trigger를 이용해 엔딩 분기를 만들 수 있습니다

 

extra_winnumbera: extra_winprizea에서 지정한 보상의 양. 자세한 건 위의 extra_winprizea 참고

 

failurea: testa 실패시 출력되는 문자

failprizea: 실패시 보상, successa랑 똑같으니 successa 참고

failnumbera:

extra_failprizea: 실패시 추가 보상. 마찬가지로 extra_winprizea랑 동일

extra_failnumbera:

 

여기에 추가로 화면 전환시 효과를 줄 수 있습니다

wineffecta: testa가 성공했을 때 줄 수 있는 화면 효과

faileffecta: testa가 실패했을 때 줄 수 있는 화면 효과

 

둘 다 아래 5개 값 중 하나를 선택해 넣어 주면 됩니다

bloodsplat / whiteflash / blackflash / glitch / sound

 

여기까지가 첫번째 선택지를 골랐을 때고, 두번째 세번째 선택지는 optiona나 testa 등 뒤에 붙어 있는 a를 b나 c로 바꿔주시면 됩니다 (ex: optiona > optionb / optionc , successa > successb / successc)

 

이제 이벤트 화면을 꾸밀 수 있는 요소들만 설명하면 끝입니다

big: 값이 0일 때, 이미지가 있으면 해당 이미지 출력, 이미지가 없으면 일반 이미지 출력

image: 불러올 이미지. 폴더명/이미지명.png 의 형식으로 값을 입력해 주면 됨

 

wavy_art: 그림을 wavy 효과와 함께 출력할 것인지 결정

wavy_speed: wavy 효과의 속도를 결정. 실제로 테스트해 본 적은 없는데 아마 낮을 수록 빨리 지나갈 거임

 

draw_ui: 1이면 화면 왼쪽에 장소랑 카드팩, 시간대 아이콘을 출력

 

x1: y1: x2: y2:

네 속성의 값을 지정해 주면 해당 값을 네 꼭지점으로 사각형 만듬

이미지를 전체 출력하지 않고 창처럼 띄우고 싶을 때 사용하면 됨

 

load_sound: 경로에 파일이 존재하면 사운드 추가

커스텀 이벤트는 여기까지입니다

공식 모딩 가이드 외에도 더 추가된 내용이 있는데, 게임 내의 코드를 보고 가져온 거라 아마 작동할 겁니다

 

2. 커스텀 캐릭터

커스텀 캐릭터는 이벤트와 비교하면 비교적 간단합니다.

안에 들어갈 내용도 적다 보니 얘는 예시 없이 바로 작성할게요!

[character] 파일의 첫번째 줄을 이걸로 시작해야 커스텀 캐릭터로 인식됩니다

 

name: 캐릭터 이름

 

strength:

dexterity:

perception:

charisma:

knowledge:

luck:

캐릭터의 기본 능력치를 결정합니다

각각 근력 / 재주 / 인지 / 매력 / 지식 / 운 에 해당

 

menu_tag: 캐릭터를 묘사하는 단어

예를 들어 기본 캐릭터인 코우지의 경우에는 "사진사#写真家" 로 설정되어 있습니다

다만 한자의 경우 일부 글자가 출력되지 않을 수 있습니다

 

menu_desc: 캐릭터의 프로필과 배경에 대한 간략한 묘사

마찬가지로 코우지의 설명입니다.

이름: 타가와 코우지#19 / 남성# #천 마디 말보다 한 장의 사진이 더 낫다는 말이 있다.#정부는 이 사건을 은폐하지 못할 것이다.|

위와 같은 식으로 캐릭터 설명을 작성하시면 되겠습니다.

 

perkpack_a / perkpack_b: 캐릭터가 레벨업 시 획득할 수 있는 전용 퍽을 결정. 팩 하나당 2개씩, 총 4개 가능

https://drive.google.com/file/d/1XzhMyMzXFwsr_g0BqHscmCSIzNAl48xi/view?usp=sharing

특성 팩의 전체 리스트입니다.

특성 팩에 있는 한글 그대로 [XXX XXX]의 형태로 입력하시면 됩니다.

 

sprite_back: 집에서 미스터리 고를 때 나오는 뒷모습

sprite_house: 집에서 출력되는 전신 모습

portrait_a: 오른쪽 능력치 창에 표시되는 기본 모습

name_a: 기본 모습의 이름

portrait_b: 캐릭터한테 적용할 수 있는 다른 모습 (의상)

name_b: 다른 모습의 이름

sprite_icon: 캐릭터 선택 화면에서 출력되는 아이콘

 

sprite_chibi: 조사시 나오는 작은 캐릭터 그림

커스텀 캐릭터를 만들려면 아마 기존 캐릭터 위에다 덧그리는 게 가장 효율적일 겁니다

게임 폴더 내 extra content\character\char_tarot에 예시 그림이 있으니 그걸 이용해도 좋고, 아니면 공식 디스코드 서버에 덧그릴 수 있는 틀이 올라와 있으니 그걸 써도 될 것 같네요.

* sprite_chibi의 경우 한글패치 버전에서 제가 임의로 추가한 기능으로, 연두색 배경 대신 투명 배경을 사용하셔야 됩니다!

 

3. 커스텀 적

커스텀 적 역시 비교적 간단하니 예시 없이 설명만 적겠습니다

[enemy] 파일의 첫번째 줄을 이걸로 시작해야 커스텀 적으로 인식됩니다

 

name: 적 이름 (필수)

subtitle: 적 이름 밑에 작게 표시되는 글자

 

type: 적 유형 (필수)

human / monster / eldritch / ghost / vampire / athyola (공식 가이드에는 없음, 버그 가능성 존재) / undead / plant / circle

위 9종 중 선택

 

location: 적 등장 장소 (필수)

downtown / school / hospital / seaside / forest / mansion / village / apartment

위 8곳 중 선택

 

author: 제작자명

 

intro: 처음 전투 시작할 때 출력되는 메시지 (필수)

 

can_run: 도주 가능 여부

기본은 1로 설정되며, 1이 도주 가능, 0이 도주 불가능

 

health: 체력 (기본 10으로 설정)

power: 위력 (기본 10으로 설정)

exp: 적 쓰러트렸을 때 플레이어가 획득할 경험치

damagevalue: 적의 피해량 (기본 1로 설정)

damagetype: 적의 피해 유형

STA / REA / ALL / DOOM 중 고를 수 있으며 각각 활력 / 이성 / 전체 / 파멸 에 해당 (기본은 활력으로 설정)

 

hit01 / hit02 / hit03 / hit04 / hit05:공격 시 표기되는 로그 메시지 (필수)

 

art01, art02: 적 이미지 프레임 1,2 (필수)

artfreq: 적의 이미지 프레임이 전환되는 속도. 낮을수록 빨라집니다 (필수)

 

prize_type: 적을 쓰러트렸을 때 나오는 보상 종류. 그런데 현재로서는 item 말고 줄 수 있는 값이 없습니다ㅡㅡ;

 

prize_name: 적을 쓰러트렸을 때 줄 아이템. 한글판에서 돌릴 거면 한글 아이템명을 입력하면 됩니다

 

 

4. 커스텀 미스터리

마지막으로 커스텀 미스터리입니다.

커스텀 미스터리는 게임에 기본적으로 적용되어 있는 미스터리를 가져와서 예시로 설명하겠습니다.

[mystery]

name="통금시간 텔레비전 테러의 특이한 투고" // 미스터리 제목

author="G.W. Musko & panstasz" // 제작자명

art="mystery_tv v_icon.png" // 미스터리 아이콘

description="최근 들어 기묘한 텔레비전 채널이 시오카와 사람들의 화두에 오르고 있다. 정말로 저주받은 초자연적인 채널인 걸까?..."

[intro]

art="mystery_tvquest_image.png" // 처음 미스터리 선택했을 때 도입부에 표시되는 이미지

text_one="통금시간 텔레비전 테러의 특이한 투고##요즘 같은 때에 밤늦게 잠들지 못하고 텔레비전 채널을 뒤적거리면, 당신은 불행하게도 4:44 채널을 발견할지도 모른다." // 도입부 텍스트 1

text_two="채널 속에선 창백한 사람들이 텅 빈 세트장에 서서, 비뚤어진 미소를 지은 채 카메라를 들여다본다고 한다. 당신이 알아들을 수 없는 언어로 쉭쉭대면서." // 도입부 텍스트 2

text_three="4:44 채널은 단순히 무해한 장난일 수도 있겠지만... 당신은 그 이상의 무언가가 있다는 것을 느낄 수 있다." // 도입부 텍스트 3 (여기에 추가로 text_fou(r) 까지 추가해 총 4번에 걸쳐 텍스트를 출력 가능합니다)

[progress]

location="스튜디오 창고" // 미스터리의 마지막에 도착할 장소

background="mystery_tvquest_back.png" // 미스터리 진행 중 배경으로 표시될 그림

one_loc="apartment" // 진행하기 위해 조사해야 할 장소; 종류는 커스텀 적으로 올라가서 확인 부탁

one_txt="당신은 침대에 앉아, 깜빡거리는 티비 화면을 들여다본다.##또다시 그 망할 채널을 놓치고 말았다." // 첫번째 장소 조사시 나오는 텍스트

one_frc="" // 불러올 커스텀 이벤트, 없으면 해당 장소의 랜덤 이벤트 발생

two_loc="downtown"

two_txt="지역 방송국부터 조사를 시작하는 것이 합리적인 것 같다.##당신은 이른 아침에 그곳으로 향하기로 한다."

two_frc=""

thr_loc="downtown"

thr_txt="이상한 채널에 대해 묻자, 피곤해 보이는 방송국 감독은 식은땀을 흘리며 양옆을 흘깃거린다. 감독은 채널의 존재를 단호히 부정하며, 당신을 사무실 바깥으로 쫓아내 버렸다.##문이 닫히기 바로 직전, 당신은 감독 뒤에 다른 사람이 서 있는 것을 발견한다. 사무실에 있는 내내 저런 사람이 있었던가?"

thr_frc=""

fou_loc="downtown"

fou_txt="무작위로 채널이 돌아가며, 텔레비전 화면이 스쳐 지나간다. 그러던 중, 당신을 노려보는 창백한 얼굴의 진행자가 보이자 몸이 얼어붙는다. 진행자는 무대 뒤에 걸려있는 어두컴컴한 형체들을 가리킨다. 저건... 시체 자루인가?"

fou_frc=""

fiv_loc="apartment"

fiv_txt="밤새도록 깨어 있는 건 거의 불가능한 일이기에, 당신은 눈을 뜨고 있으려 안간힘을 쓴다. 곯아떨어지기 직전 채널이 나타나자, 당신은 DVR의 전원을 켜는 데에 성공한다.##드디어, 채널이 존재한다는 물증을 확보했다!"

fiv_frc=""

six_loc="apartment"

six_txt="다음 날 아침 일어나니 녹화본이 완전히 뒤죽박죽이다!##그렇지만... 노이즈 너머에 그 얼굴들이 분명 숨어있을 것이다. 절박해진 당신은, 단서를 찾길 바라며 게시판을 샅샅이 뒤지기 시작한다."

six_frc="mysterymystery_tvevt_sotired.ito"

sev_loc="village"

sev_txt="드디어 단서를 발견한 것 같다.##근처 마을에 새로 지어진 창고 얘기가 포럼에 올라온 것이다. 어쩌면 텔레비전 프로그램은 이곳에서 송출되던 게 아닐까? 당신은 직접 스튜디오를 찾아내기 위해 마지막 버스를 타기로 한다."

sev_frc=""

eig_loc="ending" //끝내고 싶은 지점에서 ending 입력하면 엔딩으로 넘어감

eig_txt="당신은 마을의 식당에서 남은 저녁 시간을 보냈다. 해가 지고 식당이 문을 닫자, 당신은 커다란 스튜디오 창고로 숨어 들어간다."

eig_frc=""

nin_loc=1

nin_txt=""

nin_frc=""

ten_loc=1

ten_txt=""

ten_frc=""

[ending_a] // 이벤트에서 ending_trigger 값을 변경해 조건에 따라 다른 엔딩을 보여줄 수 있습니다. 보통은 해당 값이 0일 때 엔딩 A, 1일 때 B, 2일 때 C 라 생각하면 되겠습니다.

end_title="스튜디오 (II)" // 엔딩 화면에 표시되는 제목

end_img="mystery_tvquest_ending.png" // 엔딩 화면에 표시되는 그림

end_txta="당신은 다양한 소품과 장비를 지나 살금살금 움직이며, 빛이 어둑한 스튜디오를 걸어간다.#정중앙의 조명이 점점 더 가까워진다. 쉭쉭거리는 소음과 녹음된 웃음소리가 가까워진다." // 엔딩 화면 텍스트 1

end_txtb="당신은 시야 바로 바깥에 서서, 숨을 죽인다.##출연진은 적막한 무대 위에 올라서 서로에게 오망성을 그리고 있다. 그들 중 하나와 눈이 마주쳤다는 생각이 들어, 당신은 헉 소리를 낸다..." // 엔딩 화면 텍스트 2

end_txtc="그 다음 벌어지는 광경은 기묘하다.#출연진 전체가 당신을 공격하기는 커녕 도망친다. 렌즈가 마치 출입구라도 되는 양, 카메라 속으로 하나둘씩 사라져 간다." // 엔딩 화면 텍스트 3

end_txtd="당신은 한동안 세트장을 뒤적거린다. 그들은 어떻게 카메라 속으로 도망쳤던 것이며, 그 프로그램에는 어떤 의미가 있었던 건지 알아내기 위해.##그러나 결국 당신은 아무것도 찾아내지 못했다. 집에 도착하고 나니 텔레비전을 키는 것이 불안하다." // 엔딩 화면 텍스트 4

[ending_b]

end_title="스튜디오 (I)"

end_img="mystery_tvquest_ending.png"

end_txta="당신은 다양한 소품과 장비를 지나 살금살금 움직이며, 빛이 어둑한 스튜디오를 걸어간다.#정중앙의 조명이 점점 더 가까워진다. 쉭쉭거리는 소음과 녹음된 웃음소리가 가까워진다."

end_txtb="당신은 시야 바로 바깥에 서서, 숨을 죽인다.##출연진은 적막한 무대 위에 올라서 서로에게 오망성을 그리고 있다. 그들 중 하나와 눈이 마주쳤다는 생각이 들어, 당신은 헉 소리를 낸다..."

end_txtc="그 다음 벌어지는 광경은 기묘하다.#출연진 전체가 당신을 공격하기는 커녕 도망친다. 렌즈가 마치 출입구라도 되는 양, 카메라 속으로 하나둘씩 사라져 간다."

end_txtd="당신은 한동안 세트장을 뒤적거린다. 그들이 어떻게 카메라 속으로 도망쳤던 것이며, 그 프로그램에는 어떤 의미가 있었던 건지 알아내기 위해.##당신은 해독할 수 없는 쪽지 몇 장을 발견했지만, 그 이상의 수확은 없었다. 떠나기 전, 당신은 카메라를 챙겨 처분해 버린다. 카메라에는 알 수 없는 힘이 있으니, 4:44 채널을 이 세상과 떨어트려 놓는 것이 최선이리라."

[big_ending]

end_txt="저주받은 채널에 대해 생각하며, 당신은 시오카와로 돌아가는 버스에 올라탄다..." // 각 엔딩 끝나고 마무리 화면에 표시되는 텍스트

[ending_c]

end_title="THE STUDIO (III)"

end_img="mystery_tvquest_ending.png"

end_txta=""

end_txtb=""

end_txtc=""

end_txtd=""

 

쓰다 보니 지쳐서 뒤로 갈 수록 대충인 감이 있는데 양해 부탁드립니다

혹시 설명 부족한 부분 있으면 댓글로 질문 남겨 주세요