본문 바로가기

쓰기

ATCode 테스트버전 120207 의 댓글이 너무 복잡하게 꼬여서 이쪽으로 뺍니다.

 

현재 120207 에서 SMSTR 은 기본적으로 피시님 버전의 OVERWRITE(IGNORE,BUFCHANGE) 모드로만

돌아가도록 만들어져 있습니다. 그런데 피시님께서 부가기능이 필요하시다고 하셨는데 제가 이해가

좀 어려워서 제가 제대로 이해했는지 확인할 필요가 있네요.

 

일단 용어정리부터.

- 기본버퍼: 스마트 문자열의 앞 16바이트

- 한 라인 이내: 16 바이트 이내. 곧 유니코드 7글자 + 0x0000 혹은 ANSI 15글자 + 0x00.

- 덮어쓰기 방식: 문자열이 한 라인 이내일 때 기본버퍼안에 번역문을 덮어쓰는 방식

- 포인터 방식: 문자열이 한 라인 이상일 때 따로 버퍼를 잡아 집어넣은 다음 버퍼의 포인터만

  기본버퍼의 첫 4바이트에 기록하는 방식

- 스마트 방식: 문자열의 길이에 따라 덮어쓰기 방식과 포인터 방식을 자동선택하는 방식

 

제가 이해한 부가옵션과 동작방식

- SMSTR(부가옵션 없음. 기본): 스마트 방식을 따르되 번역문의 길이에 맞춰서 방식을 변경함. 원문이

덮어쓰기 방식이더라도 번역문이 한 라인 이상이면 포인터 방식으로 변경하고 원문이 포인터

방식이더라도 번역문이 한 라인 이내라면 덮어쓰기 방식으로 변경한다.

 

- SMSTR (MATCH) : 스마트 방식을 따르되 원문보다 번역문이 길면 번역문을 자르고, 짧으면 공백을

넣어 총 길이를 맞추는 방식. 따라서 총 길이가 동일하므로 원문이 덮어쓰기 방식이면 번역문도

덮어쓰기 방식이고 원문이 포인터 방식이면 번역문도 포인터 방식으로 동작한다. 이 때의 버퍼는

아랄트랜스의 번역 버퍼가 아닌 원래 게임에서 할당한 버퍼에 덮어쓴다.

 

- SMSTR(FORCEPTR): 번역문의 길이에 상관없이 무조건 포인터 방식으로 동작함. 설령 내용이 한 글자라도

무조건 포인터 방식으로 변경한다. 여기서 사용하는 것은 무조건 아랄트랜스의 번역 버퍼.

 

- SMSTR(IGNORE): SMSTR(기본) 과 동일하지만 아랄트랜스의 번역 버퍼를 사용하지 않고 게임이

할당해놓은 버퍼에 덮어쓴다. 번역문이 길 경우 버퍼 한계를 넘어설 가능성이 있을 수 있다.

 

혹시라도 제가 잘못 이해하고 있는 것이 있거나, 이 중 필요없는 옵션이 있거나, 반대로 필요한 옵션이

있으시면 알려주세요. 단, 토끼도 이해할 수 있도록 자세히 알려주셔야 합니다...

분류 :
Talk
조회 수 :
3800
등록일 :
2012.02.14
23:46:04
엮인글 :
https://arallab.hided.net/49640/86f/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/49640

FrigateBird

2012.02.16
17:48:54

요새 시간이 없어서 통 못왔네요...

읽어보니 필요한게 다 있군요.

 

잘 안쓰는 녀석이라면 SMSTR(FORCEPTR) 정도 겠네요.

실제 이런류가 프로그램상에서 있긴 했었습니다만..

거의 길이가 작은 녀석 전용으로 겨냥한 내용에 사용하더군요.

(길이가 한라인 이내의 내용들이 무조건 옴. ex.명령어, 특문)

 

딱히 그 부분만 피해서 코드를 짜면 SMSTR(FORCEPTR)는 필요가 없지만..

 

방법을 바꾸면 SMSTR(FORCEPTR) 가 요긴하게 쓰이게 됩니다.

예를 들어 SMSTR(FORCEPTR)의 기능에서 길이의 위치만 직접 위치 선정할 수 있으면 좋겠네요.

 

원래 위 기능의 동작방식은..

기본버퍼의 첫 4바이트에 포인터 방식으로 대사가 있다는 전제하에 (버퍼는 아랄 버퍼)

겨냥한 버퍼+0x10 위치에 길이,      버퍼+0x14 위치에 최대 길이(0x0F+0x?0형태)

를 수정하는 형태이겠지요?

(아니라면 태클걸어주세요)

 

거기서 "버퍼+0x14 위치에 최대 길이" 의 계산식은 제거해주시고(없다고 생각하시고),

"버퍼+0x10 위치에 길이" 의 "+0x10" 위치를 유동성으로 선택 가능하게

기능이 추가 되었으면 합니다.

 

ex)

EDX 에 후킹

SMSTR(FORCEPTR(0x4))

[EDX] : 아랄 버퍼로 포인터 변경(원래 동작방식)

EDX+0x4 : 해당 지점에 길이 있음. (원래 길이가 +0x10 위치라면 지금은 포인터 옆인 +0x4 위치에 있다는 소리)

whoami

2012.02.16
20:22:39

아. 실은 SMSTR 기능과 별도로 길이 보정 기능을 넣으려 하고 있습니다. OVERWRITE나 PTRCHEAT 에서도

일반 옵션으로..예를 들면 LEN(4,1) - pArgText 위치부터 +4바이트 위치에 1바이트 형식으로 길이 정보가 있으니

번역문 길이로 바꿔넣어라 - 처럼 말이죠. 이렇게 하면 말씀하신 기능은 PTRCHEAT+LEN() 으로 대치가 가능할

듯 싶군요.

 

그러면 SMSTR 에서 FORCEPTR 은 필요 없고, 다른 두 가지 기능은 다 필요하다 이 말씀이시죠?

 

그리고.. 그 외에 추가하면 좋을 기능이 있으면 같이 적어두세요.

 

FrigateBird

2012.03.02
17:35:29

추가하면 좋을 것 같은 기능 1.

 

현 ATCode 인지 이지트랜스 함수 문제인지 기억은 아리송한데

 

번역길이가 2MB (4MB 였나?) 를 넘어가면 그만한 버퍼 생성 불가로 뻗어버리더군요.

(생성하지 않고 그냥 이지트랜스로 보내버려도 그쪽 함수에서도 제한 버퍼가 있던걸로 기억합니다.)

 

이런 글의 번역 해결 방안으로는 개행이나 특정 글(특정문자)을 기준으로 여러번 돌려 번역한다는 정도인데..

아랄 버퍼로 바꿀 시 그게 버틸지 의문이네요.

구린 컴에서는 안된다거나 하는 사태가 없어야 하는데;

 

기리기리 마냥 비슷한 꼴로 돌아가되 ATCode 같이 사용자 지정 위치에서 적용되는

스크립 번역 기반이 필요할 듯 싶습니다.

(몇가지 간소한거 설정하고...말이지요)

whoami

2012.03.02
18:01:00

ATCode 내에서 문자 최대 길이 (MAX_TEXT_LENGTH) 가 1024 로 되어 있습니다. *2 해서 2048 바이트죠.

하지만 이걸 수정하는 것이 좀 골치아픈게 중간에 걸려있는 모든 필터/번역기와 크기를 맞춰야 한다는 것이죠.

 

방법이 하나 있기는 합니다. 아랄트랜스 전역설정으로 버퍼크기를 잡아놓고 모든 플러그인이 이 크기를

기준으로 버퍼를 동적할당하도록 만들어 버리면 됩니다. 물론 모든 플러그인 업데이트를 해야 한다는

문제가 생깁니다만.. 어쨌든 방법은 방법이죠.

 

그런데 거꾸로.. 1024 문자가 필요할 정도로 큰 문자열이 쓰이느냐 하는 문제를 고려해봐야 합니다.

 

물론 기리기리 같은 풀셋 스크립트 같은 경우 1024 문자는 당연히 모자랍니다만, 이런 풀셋 스크립트

엔진이 그리 많은 것이 아니라고 볼 때 차라리 전용 후킹 플러그인을 하나 개발하는 것이 편할지도 모릅니다.

 

대사와 대사 사이 문장종료를 \0 을 안쓰는 스크립트라면.. 그런 종류가 적다면 전용 후킹 플러그인을

사용하거나, 꽤 많다면 문장종료 문자를 다른 문자로 인식하는 옵션을 넣던가요. 어차피 전체 스크립트를

한번에 보내버린다 하더라도 중간에서 문장종료 표시를 다른 글자 (\n 이라던가)로 바꿔넣어줘야 제대로

동작하겠습니다만.. 하지만 이렇게 되면 일반적으로 사용하는 C/C++ 라이브러리를 못쓰게 되기 때문에

전체적으로 무지하게 복잡해진다는 단점이 생기긴 합니다...

List of Articles
번호 제목 글쓴이 조회 수 추천 수sort 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
183 Talk cmd로 리버ex 테스트 [2] file 앙마vv 8011   2008-07-25 2009-01-06 01:27
 
182 Talk RLCmd, KoFilter 의 디버그 로그 기능에 대해.. whoami 9246   2008-07-26 2009-01-06 01:26
슬슬 RLCmd와 KoFilter 의 테스트버전 딱지를 떼어줘야겠는데요, 디버그 로그 기능을 뺄까 그냥 놔둘까 생각중입니다. 어떻게 하면 좋을까요? 1. 필요하므로 그냥 놔둔다. 2. 없애고 로그기능만 넣은 디버그용 로그 필터를 하나 새로 만든다.. (단 디버그용 로...  
181 Talk ATCode 버전업에 대해 - 관리자님 봐주세요.. [1] whoami 9241   2008-07-26 2008-07-27 02:35
오랫동안의 (.. 그리 오랫동안은 아닌 것 같은 기분도 들지만) ATCode 테스트 버전의 테스트로 SOW 모드가 어느정도 안정이 되었다고 생각됩니다. 그래서 기존 ATCode 에 융합해서 버전업을 하고 싶은데 어떻게 했으면 좋겠습니까? 그냥 SVN 내에서 커밋만 하...  
180 Talk SOW 방식 지원 ATCode 플러그인 소스 커밋하였습니다.. [2] whoami 8829   2008-07-27 2008-07-27 21:12
빠진 파일은 없을겁니다; 버전 정보는 손대지 않았습니다. 버전 정보 업데이트 해주시고.. 혹시라도 문제가 있으면 알려주시기 바랍니다. (개인적으로는 아랄님 자주 보고 싶은데 덧글 하나 없이 대화방에도 없이 스리슬쩍 사라져 버리셔서 아쉽.. ㅡ.ㅡ)  
179 Talk RLCmd, KoFilter 의 디버그 로그 기능에 대해 - 2 whoami 10308   2008-07-28 2009-01-06 01:26
현재 정식버전에 디버그 로그기능은 살아있습니다. 단, 일반 사용자가 건드릴 수 없도록 옵션창에는 빠져 있습니다. 사용하시려면.. 멀티플러그인의 옵션 직접입력 창에서 집어넣거나 바로가기 편집에서 직접 넣어주시기 바랍니다.  
178 Talk 사용자 사전 플러그인에 대해서 설문 [5] Hide_D 8785   2008-07-30 2008-07-30 22:47
으음 기본적으로 모든 게임에 사용되는 사용자 사전 을 목표로 진행중이기 때문에 ezTransXPwithCustomDic이 아니라 ezTransXP가 되고 싶습니다만... 0.2에서는 특별한 다이얼로그가 없기 때문에 이걸 그냥 ezTransXP.dll로 만들어 달라기도 애매한 상황입니다...  
177 Talk 쓸모가 있을것 같은 기능들 [4] Hide_D 18225   2008-07-30 2010-08-04 16:58
1. 줄 재배치 (기능) 사용자 입력으로 개행 기호 (r, n, <br> 등등)를 입력 받고 일본어 부분에서 일단 저것들을 제거했다가 번역후 다시 넣는 기능. (효과) (1) 번역률 향상 개행문자가 사이에 있으면 심오한 번역문이 나옵니다. (2) 벽뚫기 완화 개행문자를 ...  
176 Talk 전에 쓸모 있는 기능의 2번 관련 Hide_D 8860   2008-07-31 2009-01-06 01:00
whoami님이 생각하시는 것 처럼 정규식도 생각은 해봤는데, 이건 저로서는 무리고 =ㅅ=; 저거 비스무~리 하게 와일드 카드만 사용 할 수 있는 모델을 게획해 봤는데, '이걸 만들어야 할지 말아야 할지' Hide_D는 연습장에 적힌 내용을 소환했다. > 문장의 시작...  
175 Talk 리얼라이브 세이브에 대해서... [4] 나는누구인감? 7894   2008-08-01 2009-01-06 01:00
오늘 학교에서 하라는 공부는 안하고 곰곰히 생각을 해봤습니다. 세이브 할 경우 현재 위치의 이미지 정보 읽어들임 → 현재 위치의 대사 정보 읽어들임 → 세이브 파일에 저장 로드 할 경우 세이브 파일의 이미지 정보 읽어들임 → 세이브 파일의 대사 정보 읽어...  
174 Talk DumpText를 만들고 있는데... [2] Hide_D 7892   2008-08-02 2008-08-02 12:04
밖에서 모달리스 다이얼로그 안으로 데이터를 넣어주는 간단한 방법 없나요 =ㅅ=; 저 방법이 생각안나서 지금 해보려고 하는게, 실시간으로 바깥의 isTextFilled 를 체크해서 true인 경우만 밖의 텍스트를 가져온 다음에 isTextFilled를 false로 만드는 방법밖...  
173 Talk 퓩퓩... 퓩퓩... oTL whoami 7557   2008-08-02 2009-01-06 01:35
원인을 알아냈습니다. 하지만 이건.. 참 난감하군요. 이 문제는 RLCmd의 문제가 아닙니다. 이 문제는 SOW방식의 문제도 아닙니다. 이 문제는 한글 완성형 코드의 문제입니다... oTL 예전에 KoFilter 를 한참 만들고 있을 때... 이 이야기가 나온 적이 있었습니...  
172 Talk 문자열 -> Hex 변환이 제대로 안되네요. [7] Hide_D 7561   2008-08-02 2009-01-06 01:00
LPSTR ConvertHex(LPCSTR source){ size_t Len=strlen(source); char Temp[2048]=""; BYTE szBuf[3] = { '', }; int j=0; for(size_t i=0;i<Len;i++){ szBuf[0]=(BYTE) source[i]; szBuf[1]=(BYTE) source[i+1]; if(szBuf[0]<0x80){ //1바이트 코드라면 j += ...  
171 Talk DumpText는 아직 개선이 좀 필요한듯; [3] Hide_D 8111   2008-08-03 2009-01-06 01:00
여러개를 켤 수가 없다는 단점이 있네요[...] 그나저나 질문, 헤더 파일에서 extern으로 선언하면 그 프로그램 전체에서 공유되는건가요? 그렇다면, 창은 하나만 띄우고 플러그인 로드될때마다 번호를 매겨서 옵션을 먹여야 하려나요..  
170 Talk 0.3에서 추가할것 Hide_D 7908   2008-08-03 2009-01-06 01:00
까먹을까봐 정리 사용자 사전계 1. 사용자사전 유/무 2. 범용사용자사전 유/무 3. 사용자 정의한 주소의 파일 열기(취소) 4. 탭처리 5. 검색 알고리즘 강화(보류) ezTransXP 강화계 1. 번역후 괄호 처리(다이얼로그에 추가)(보류) 2. 사용자 사전과 완벽히 분...  
169 Talk VS 2005로 갈아탔습니다 [1] Hide_D 8272   2008-08-03 2009-01-06 01:34
MFC, 리소스 에디터 때문에 도저히 못 버티다가 옮겼습니다. VS 2008 깔고는 그 느린 속도에 기겁했는데, 이쪽은 꽤 빠르네요. [우홋홋] 근데, 2005와 2008 차이가 뭐죠? 버전 옮길때 그냥 파일 열고 버전 숫자만 바꾸면 땡이네요[...]  
168 Talk 현재까지 작업물 + 에러 OTL [2] file Hide_D 9891   2008-08-03 2008-08-03 21:08
 
167 Talk 함수, 변수 작명법 잘 정리된곳 없나요; [1] Hide_D 9291   2008-08-03 2009-01-06 01:00
결국 소스로 올려야하니까 좀 정리는 해둬야겠다.. 싶어서 번역쪽은 그냥 0.2버전(캐시 초기화) + 약간의 강화로 변경  
166 Talk 플러그인을 다시 Multi2용으로 만들면서 생긴 궁금증 [4] Hide_D 8374   2008-08-09 2009-01-06 01:26
MFC를 그대로 써야하는지라 API용의 기본틀을 쓸순 없어서 새로 만들었는데, extern "C" __declspec(dllexport) BOOL __stdcall OnPluginInit(HWND hSettingWnd, LPSTR cszSettingStringBuffer); extern "C" __declspec(dllexport) BOOL __stdcall OnPluginOpt...  
165 Talk 맵을 이렇게 사용해도 되나요? [2] Hide_D 8705   2008-08-09 2008-08-09 22:13
void CCustomDic2::SetKey(LPCSTR JpnWord, LPCSTR KorWord) { map<UINT,struct DicWord> EmptyMap; struct DicWord TempWord; map<size_t,UINT>::iterator iterBook; TempWord.WordLen = strlen(KorWord); TempWord.WordN = WordN++; UINT Hash=MakeStringHas...