FixLine
개발자 : Hide_D, 지나가다정착한이A님
기능 : 문장, 함수 처리
기본적으로 대화창 내에서 문자열이 제대로 배치되도록 도와주는 플러그인입니다.
한줄당 크기를 조정해 대화창 밖으로 빠져나가지 않도록하고,
루비 문자나 기타 함수가 있을 경우 그 틀을 유지한 상태에서 최대한
번역률을 높이도록 도와줍니다.
이 필터의 기능을 쪼갠 것이 DCOnly, OutRuby 입니다.
목록
FixLine 1. 작동 방식
FixLine 2. 옵션 설명
FixLine 3. 적용 방법
매뉴얼 FixLine 1. 작동 방식(by Hide_D)
우선 FixLine에 구체적인 작동 방식을 써보도록 하겠습니다.
그냥 FixLine 사용하실 분은 읽어보실 필요는 없고,
FixLine이 어떻게 돌아가는지 확인하시고 싶은 분만 읽어주시면 감사하겠습니다;
나는 소스 보겠어! 하시는 분은
SVN에서 다운받아서 소스 분석해 보세요.
(좀 허접해서 알아보기 어려울거에요)
예제를 같이 들어서 해보겠습니다.
店長n「休日は{サニーサイド:ここ}の定休日になってる土曜と、n それにプラス1日の計2日間」%K%P
이 문장은
{ 본문 : 루비 } 구조의 루비옵션을 가지고 있고 (여기서 번역률을 위해 본문을 제외하고 모두 제거합니다)
%K , %P는 옵션 문자이며
n은 개행문자입니다.
첫번째줄은 무조건 이름이 들어가게 됩니다.
전처리
店長n「休日は{サニーサイド:ここ}の定休日になってる土曜と、n それにプラス1日の計2日間」%K%P
1. 우선 개행 문자에 따라 줄 갯수를 세고, IgnoreLine(줄무시)또는 첫줄체크가 되어있으면,
그 줄만큼 미리 '텍스트 인자 목록'에 '텍스트'옵션을 달고 추가해둡니다.
「休日は{サニーサイド:ここ}の定休日になってる土曜と、n それにプラス1日の計2日間」%K%P
(1) 店長n
2. 남은 문장에서 모든 개행문자를 제외합니다.
「休日は{サニーサイド:ここ}の定休日になってる土曜と、 それにプラス1日の計2日間」%K%P
(1) 店長n
3. 그후 함수의 규격(옵션에서 설정합니다)에 따라 맞는 녀석이 있는가 확인하고,
일반 텍스트는 '텍스트 인자 목록'에 '텍스트'옵션으로 추가하고,
함수는 '함수'옵션을 추가합니다.
(이때 함수는 내부적으로 인자 단위로 쪼개져서 들어갑니다.)
(1) 店長n
(2) 「休日は
(3-1) { (삭제)
(3-2) サニーサイド
(3-3) : (삭제)
(3-4) ここ (삭제)
(3-5) } (삭제)
(4) の定休日になってる土曜と、 それにプラス1日の計2日間」
(5) %K
(6) %P
4. 이제 함수, 텍스트를 비교해서
함수에 삭제 옵션에 따라서 모두 덜어냈을때 일반 텍스트와 차이없는 경우(루비처리 같은 경우)
함수를 없애고 근처의 텍스트와 합칩니다.
(1) 店長n
(2)「休日はサニーサイドの定休日になってる土曜と、 それにプラス1日の計2日間」
(3) %K
(4) %P
5. 번역기로 보내기 위해 '텍스트 인자 목록'에서 '텍스트'옵션 (함수의 인자 중에 텍스트인 것도 포함)인 녀석을
구분자 _-/_를 붙여서 번역기로 보냅니다.
이때 어떤 텍스트를 보냈는지는 따로 저장해 둡니다.
店長n_-/_「休日はサニーサイドの定休日になってる土曜と、 それにプラス1日の計2日間」
(현재 %K,%P는 인자옵션에서 '함수'로 등록되어있으므로 번역기로 보낼때 추가되지 않습니다.)
후처리
현재 번역기에서 돌아운 문장은 다음과 같습니다.
점장n_-/_ 「휴일은 사니 사이드의 정기휴일이 되어있는 토요일과 거기에 플러스 1일의 합계 2일간」
또한 현재 '텍스트 인자 목록'은 다음과 같습니다.
(1) 店長n
(2)「休日はサニーサイドの定休日になってる土曜と、 それにプラス1日の計2日間」
(3) %K
(4) %P
1. 이제 _-/_로 텍스트를 나눠서 원래 자리로 번역 텍스트를 넣습니다.
(1) 점장n
(2)「휴일은 사니 사이드의 정기휴일이 되어있는 토요일과 거기에 플러스 1일의 합계 2일간」
(3) %K
(4) %P
2. IgnoreLine이 설정되어 있는경우 '텍스트 인자'중 무조건 1번을 출력합니다.
점장n
(1)「휴일은 사니 사이드의 정기휴일이 되어있는 토요일과 거기에 플러스 1일의 합계 2일간」
(2) %K
(3) %P
3. 이제 남은 텍스트를 길이에 맞춰서 개행문자를 넣어 마무리합니다.
점장n「휴일은 사니 사이드의 정기휴일이 되어있는 토요일n과 거기에 플러스 1일의 합계 2일간」%K%P
(여기서 %K,%P는 함수이며, 길이X로 설정되어있으므로 길이에 계산되지 않습니다.)
완료 문장
점장n「휴일은 사니 사이드의 정기휴일이 되어있는 토요일n과 거기에 플러스 1일의 합계 2일간」%K%P
매뉴얼 FixLine 2. 옵션 설명(by Hide_D)
FixLine에 대해서
FixLine은 원래는 줄처리가 제대로 되지 않아서 문제가 생기는 게임들을 위해 만들어진 필터입니다.
주 대상은 다음과 같습니다.
(1) 글자들이 대화창 밖으로 벗어나는 경우
(2) 글자들이 잘못 개행되어 줄이 어긋나는 경우
(3) 번역은 제대로 되는데 둘째줄부터 박살나는경우
(4) 대사는 출력되는데, 음성이나 그림등이 정상적으로 출력되지 않을 경우에.
(해당 명령문구를 번역 처리 과정에서 망가뜨렸을 경우)
1. 기본설정
기본 설정에서는 FixLine의 초기목표(OTL) 이었던 줄 처리 관련 부분이 들어있습니다.
여기에 입력된 내용에 따라서
먼저 개행 문자를 떼고,
번역 한 다음,
최대 Byte수와 최대 줄 수에 따라서 개행문자를 다시 넣어줍니다.
<<< 세부적인 설정을 하는 분들이라면 기본 설정은 사용 안함으로 처리 하게 됩니다. >>>
(1) 한줄당 최대 Byte수
한줄에 들어가는 최대 길이를 지정합니다.
일본어 상태일 때, 일반적으로
한줄에 들어가는 글자수 * 2
로 넣으시면 됩니다.
(2) 최대 줄 수
최대 줄 수를 지정합니다.
지정한 줄 수를 벗어날때 게임이 오류가 나는경우 사용하면 되며,
이외의 경우에는 번역문이 잘리지 않도록 실제 제한 보다 1정도 크게 해주시는 편이 좋습니다.
*. 원문 줄 수 초과 방지
실제 최대 줄 수에 비해서 여유가 있지만
원래 문장보다 번역문의 줄 수가 더 많을 때 에러가 나는 경우 사용하는 기능입니다.
이 때는 들어온 줄 수와 그대로 맞춰집니다.
(3). 개행 문자
실제 게임 내부에서 사용하는 개행 문자를 적어줍니다.
개행 문자를 적으면, 번역을 할 때 한 줄이라고 판단되는 지점(위에 적은 바이트 수)에서
자동적으로 개행 문자를 넣습니다.
반대로 개행 문자 제거를 클릭하면
해당 개행 문자가 올 경우에 개행문자를 제거해주는 기능을 하게 됩니다.
개행 문자는 DumpText를 통해서 확인 할 수 있습니다.
(4) 길이 제한
전체 출력되는 전 문장의 길이값을 제한 하는 기능입니다.
보통 출력문장이 일정한 길이를 초과하게 되면 게임이 튕기게 되는 경우에 사용합니다.
일반적으로 사용 안함으로 하며
원문 길이로를 체크하면 원문 길이 값으로
다음 길이로에서 고정된 길이 값을 체크 할 수도 있습니다.
2. 함수 설정
FixLine의 함수부는
문장 내의 특정 구간을 지정해서
부분 번역, 삭제 기능을 합니다.
기본 구조 및 개념
하나의 '함수'는 여러개의 '인자'를 가질 수 있으며,
인자는 값이 지정되는 '함수'와
지정되지 않는 '텍스트' 두가지 종류가 있습니다.
(1)기본 구성
대부분의 경우
1개 이상의 함수와
0개 이상의 텍스트를 갖게됩니다.
예제
あBそう/B <- B (함수1), /B (함수1) 또는 텍스트 (함수2, 텍스트1)
なんだ?この猫*ねこは。 <- 텍스트 * 텍스트 (함수3, 텍스트2)
患者「どうしたんですか?」 <- 텍스트 (함수1, 텍스트1)
(2)길이
속성에서 설정하는 '길이'란은
FixLine의 기본기능 중 하나인 줄바꿈 기능과 연동하기 위해 쓰입니다.
기본적으로 줄처리에는 '글자'단위로 처리하지만,
함수부에서는 '함수' 전체로 처리합니다.
예를 들어 길이O로 처리된 한 함수의 텍스트 길이가 10이고,
한줄의 최대 40Byte인 상태에서 현재 35Byte까지 있는 경우
그 다음줄에 함수 전체를 출력하게 됩니다.
(3)번역
기본적으로 함수는 값이 그대로 유지되어 번역되지 않으며,
텍스트 인자인 경우 번역 여부를 선택 할 수 있습니다.
번역기로 번역시 의성어를 번역하는 경우처럼 번역값이 한글자도 나오지 않는 경우
게임이 튕기는 경우가 있기에 이때는 오류를 막기 위해 원문으로 반환합니다.
옵션 설정 창 안내
(1) 함수 목록창
함수는 패턴으로 만들어서 추가하게 됩니다.
여기서 함수 체크의 우선순위는 맨 위에 있는 값 부터 먼저 이뤄집니다.
패턴 설정에서 추가를 누르면 패턴의 특성을 설정 할 수 있습니다.
1. 패턴 특성
(1) 기본값 : 기본값은 문장 전체에 걸쳐서 체크 하게 됩니다. 일반적입니다.
(2) 문자열 시작 : 문자열 시작은 문장의 문두의 단어에서 체크하게 됩니다.
(3) 문자열 종료 : 문자열 종료는 문장의 마지막 단어를 체크하게 됩니다.
(4) 문자열 전체 : 현재 기본값과 기능이 같습니다.(아마도?)
2. 인자 목록
인자 목록에서는 실제로 패턴의 내용을 결정합니다.
앞 뒤 공백 제거는 인자를 검사할 때에 공백 부분을 빼고 검사하는 기능입니다.(거의 사용하지 않는 기능)
인자목록에서 추가를 누르면 다음과 같은 창이 생성됩니다.
(1) 종류 선택
정해진 문자열 이란 문자열 정의에서 정의한 문자만 판단하겠다는 뜻입니다.
임의의 문자열 이란 조건에 만족하는 모든 문자들을 전부 판단하겠다는 뜻입니다.
(2) 개행 설정
개행에 포함하게 되면 길이를 검사하는데 있어서 길이 값에 추가하게 됩니다.
포함 - 자동 또는 수동의 방식과
제외의 방식이 존재합니다.
포함 - 수동의 방식은 정해진 바이트 만큼만 개행에 추가해 주겠다는 뜻입니다.(마찬가지로 거의 사용되지 않는 기능)
(3) 번역 처리
번역 함 : 문자열 정의에서 정의한 문자를 번역 하게 합니다.
번역 안함 : 문자열 정의에서 정의한 문자를 번역 하지 않게 합니다.
(4) 길이 설정
종류 선택에서 임의의 문자열을 설정했을 경우에 사용하는 기능입니다.
임의의 문자열이 갖게 되는 길이값을 설정할 수 있습니다.
기본형으로 둘 경우에는 무제한이 가능합니다.(0 = 무제한)
(5) 문자열 정의
실제 패턴에 들어갈 문자를 정의하는 곳입니다.
오른쪽의 문법을 눌러서 어떻게 정의하는지 확인할 수 있습니다.
문자열 정의의 주의사항.
1. 헥스값으로 문자열을 적는것을 권장합니다.(일반 글자로 적었을 경우에는 제대로 인식 하지 못할 수 있습니다.)
>> 헥스값은 덤프 텍스트 필터에서 쉽게 구할 수 있습니다.
(6) 기타 설정
출력시 제외는 실제 문장이 반환될 때 해당 패턴의 값을 제외시켜 버리는 것입니다. 보통 개행 문자를 제거할 때 사용합니다.
무시 가능은 패턴이 여러개가 중첩되어 있을 때, 중간에 있는 패턴이 만약 없더라고 그 패턴을 무시하고 그 다음 패턴을
판단하도록 해주는 기능입니다.
예를 들어
다음과 같이, 하나의 패턴에는 여러개의 인자를 넣을 수 있습니다. 이 경우에 원래는 81 41 0a 81 45 라고 헥스값(인자)이
들어와야만 픽스라인 필터는 해당 패턴에 맞는다고 인식하게 됩니다. 그러나 %0a를 무시처리 하면 81 41 81 45 라는 헥스 값에
대해서도 해당 필터로 인식할 수 있습니다.
번역 / 길이 / 제외 / 통과는 각각 번역함(번역안함) / 길이값 자동(수동) / 출력 제외(제외 안함) / 무시처리(처리안함)의
뜻을 갖고 있습니다.
매뉴얼 FixLine 3. 적용 방법
店長n「休日は{サニーサイド:ここ}の定休日になってる土曜と、n それにプラス1日の計2日間」%K%P
해당 문장의 헥스값을 구하면 다음과 같습니다.
店長n「休日は{サニーサイド:ここ}の定休日になってる土曜と、n それにプラス1日の計2日間」%K%P
93 58 92 B7 6E 81 75 8B 78 93 FA 82 CD 7B 83 54 83 6A 81 5B 83 54 83 43 83 68 3A 82 B1 82 B1 7D 82 CC 92 E8 8B 78 93 FA 82 C9 82 C8 82 C1 82 C4 82 E9 93 79 97 6A 82 C6 81 41 6E 81 40 82 BB 82 EA 82 C9 83 76 83 89 83 58 82 50 93 FA 82 CC 8C 76 82 51 93 FA 8A D4 81 76 25 4B 25 50
처음에 접하면 복잡하게 보이겠지만, 일단 일본어는 2바이트이고, 영어나 기호들은 1바이트라고 생각하시면 됩니다.
위의 문장을 통해 생각해 보면 다음과 같은 것을 알 수 있습니다.
店長 이름 입니다.
n 이름과 대사를 구별하기 위해 사용한 명령어 입니다.
「休日は{サニーサイド:ここ}の定休日になってる土曜と、 첫번째 줄의 대사일 것입니다.
n 첫번째 줄과 두번째 줄의 대사를 구별하기 위해 사용한 명령어 입니다.
それにプラス1日の計2日間」 두번째 줄의 대사일 것입니다.
%K%P 대사가 끝났음을 알려주는 명령어 입니다.
이 때, 이름과 대사를 구별한다거나, 첫번째 줄과 두번째 줄을 구별한다는 것을 일종의 엔터를 통한, 줄 바꿈의 기능으로
생각할 수 있습니다. 이럴 때 사용하는 문자를 개행 문자라고 말합니다. 따라서 n은 개행문자일 것이라고 추측할 수 있습니다.
두번째로 마지막에 오는 문자는 프로그램에게 현재 출력되고 있는 문장이 끝났음을 알려준다고 해서 종결문자라고 합니다.
따라서 %K%P가 종결문자일 것이라고 추측할 수 있습니다.
보통 픽스라인은 위와 같은 두 문자에 대해서 사용하게 됩니다. 즉 개행문자와 종결문자를 처리하기 위해 사용하게 됩니다.
예를 들어 개행 문자를 지워주지 않으면, 번역을 하는 과정에 있어서 번역이 제대로 되지 않거나,
번역하는데 줄 밀림이 발생할 수 있습니다.
또한 종결문자를 잘못 번역하게 되면, 종결문자를 게임의 프로그램이 제대로 인식하지 못하게 됨으로써 대사가 무한정 출력되면서
동시에 게임이 튕기게 됩니다.(코드를 찾을 때 자주 접하는 현상입니다.)
따라서 우리는 위의 예제에 있어서는 n이라는 개행문자는 지워주고, %K%P 라는 종결문자는 번역하지 않으면서 남겨둬야 한다고
생각할 수 있습니다.
이런 경우에 픽스라인의 패턴설정에서는
문자열 정의 : n, + 출력 제외처리
%K%P, + 번역 안함 처리 를 하게 됩니다.
이렇게 할 때, 1바이트의 경우에는 그냥 정의해도 되지만(예를 들면 n, %K%P)
헥스값으로 정의하는 것이 안전합니다. 이 경우에는 n(6E),%K%P(25 4B 25 50)가 될 것입니다.
그러면 우리는 다음과 같이 정의할 수 있습니다.
그런데 여기서 주의해야 할 점은,
이렇게 처리하면
이름과 대사가 붙어서 나오게 될 것입니다.
예를 들어
영미n안녕하세요n폴라리스님 라는 문장이 원래 출력되면
영미
안녕하세요
폴라리스님
이라고 출력될텐데, 여기서 n을 모두 제거하면
영미 안녕하세요 폴라리스님 << 이렇게 출력이 됩니다.
이러한 점을 방지하기 위해서 우리는 임의의 문자열을 사용하게 됩니다.
예를 들어, 보통 이름의 바이트는 16바이트(8글자)를 넘지 않지만, 한 문장의 글자수는 8글자를 넘을 것이라고 생각할 수
있습니다. 그렇다면 우리는 패턴을 좀 더 세밀하게 설정해서
해당 문장이 8글자가 넘었을 때 n이 있으면 출력 제외 시키고, 그렇지 않다면 n을 그냥 남겨놓으라고 설정할 수 있습니다.
이런 패턴을 만들 때 임의의 문자열을 사용하게 됩니다.
임의의문자열 - 길이 제한을 16바이트 이상으로 + n - 출력 제외 라는 패턴을 사용하고 난 후에
그렇지 않은 경우에 대해서는 n을 번역 안함으로 처리 하면
이름과 대사를 구분시키면서도 대사간의 개행을 없앨 수 있습니다.(약간 복잡한가요?..)
그렇게 만든다면 다음과 같이 패턴이 변하게 됩니다.
여기서 위의 임의의 텍스트에는 이름이 올 것이기 때문에 번역 해 줘야 합니다.
이렇게 해서 맨 위의 패턴에 넣은 다음에(우선순위를 맨 처음으로 올림) 그렇지 않은 경우에는 n을 번역 안함으로 처리합니다.
(다시 임의의 문자열을 만들어서 이번에는 16바이트 미만일 때는 출력제외 하지 않는 것으로 설정하면 됩니다.)
물론 파인더라면 1바이트의 영문기호는 한글 번역을 거쳐도 그대로 1바이트 영문 기호로 나온다는 것을 알기 때문에
추가적인 패턴을 넣진 않을 것입니다...
이런식으로 픽스라인을 설정해서 패턴을 입력하게 됩니다.
패턴을 얼마나 정교하게 설정하는가에 따라서 게임이 깔끔하게 번역될 수도 있고
게임이 튕길수도 있습니다.