[TinTin] 틴틴 메뉴얼 (펌)
TINTIN++
Version 1.5
Written by,
Bill Reiss,
Joann Ellsworth,
Jeremy C. Jack,
and David A. Wagner
Docs written by Joann Ellsworth (c) 1994
The use of this documentation, for other "hacked" versions of Tintin++, without the expressed written consent by Joann Ellsworth, is prohibited.
1994년 Joan Ellsworth가 작성하였으며 모든 권한은 그에게 있다.
2000년 지윤찬이 한국어로 번역하였으며 Joan Ellsworth의 반대가 없을 경우에만, 번역문에 관한 모든 권한은 지윤찬에게 있다.
Joann Ellsworth에 의해 작성된 허가를 명시하지 않은 체, 다른 "해킹된" 틴틴++에 이 문서를 사용하는 것은 금지된다.
번역문과 원문사이의 차이로 인하여 발생하는 모든 종류의 문제에 있어서, 전적으로 원문의 내용이 우선한다.
(역자 주소 : bonywine@super.inha.ac.kr)
T I N T I N ++
v1.5 공식 버전
(T)he K(I)cki(N) (T)ick D(I)kumud Clie(N)t
차례
틴틴++란 무엇인가?
틴틴++는 머드 플레이를 돕기 위해 특별히 제작된 클라이언트 프로그램이다. 이 것은 틴틴III의 개선판으로서 틴틴III이후에 많은 새로운 기능들이 추가되어졌다. 틴틴의 확장 가능성을 알고 있었고 그 프로그램 스타일을 좋아했으므로, 우리는 우리가 만들고자 하는 사상 최강의 머드 클라이언트의 원형으로 틴틴을 사용하기로 하였다.
틴틴++의 새로운 기능들
우선, 많은 버그가 수정되어졌다.(대부분 CHANGES 파일에 기술되어 있다) 그 중 가장 중요한 버그 수정으로 #loop, #split, 세션의 일시정지, 정확한 에코 출력 등을 꼽을 수 있다. 도움말 파일의 위치는 $HOME 디렉토리로 옮겨졌으며, 현재 틴틴++는 디스크 공간을 절약하기 위하여 도움말 파일을 압축하는 것을 지원한다.
틴틴++ v1.5의 새로운 명령어는 다음과 같다.
retab | tablist | info |
textin | killall | pathdir |
suspend | tabadd | tabdelete |
cr | wildcard |
|
화면 분할(Split screen)
화면 분할 기능을 사용하기 위하여 당신은 반드시 VT-100/ANSI 호환 터미널 또는 터미널 에뮬레이터를 사용하여야 한다. 화면 분할이란 화면을 둘로 나누어 위쪽은 머드 화면을 표시하고 아래쪽은 사용자의 입력을 받아들이는 용도로 사용하는 것을 말한다. 이 것은 머드의 스크롤로 인하여 사용자가 입력한 라인이 깨어짐 없이 전체 라인을 보며 입력하는 것을 가능하게 한다.
탭 자동완성(Tab Completion)
탭 자동완성은 당신이 좋아하게 될 만한 작지만 멋진 장치이다. 틴틴++의 파일 중 tab.txt라는 파일이 있다. 이 파일은 한 줄에 하나씩의 단어를 담고 있는 단어의 목록이다. 탭 자동완성 기능은 사용자가 단어의 처음 몇 자를 입력한 후 탭 키를 누를 때 동작한다. 틴틴++는 tab.txt에서 읽혀진 단어의 목록을 검사하여 완전한 단어가 무엇일지를 추측해낸다. 이 것은 긴 단어나 입력이 어려운 철자의 단어에 유용하다. 너무 비슷한 단어들을 tab.txt의 리스트에 포함시켜 놓으면 올바른 결과를 얻지 못할 때도 있으므로 주의하여 단어들을 선정하는 것 또한 잊지 말아야 할 것이다.
(tab.txt 의 내용은 다음과 같다고 하자) Grimmy (만약 당신이 아래와 같이 입력하면...) tord <= 틴틴++는 tord를 tordenskjold로 바꿔줄 것이다. |
1.5 버전에서는 새로운 탭 자동완성 단어리스트를 읽어들이기 위해 새 tab.txt 파일 전체를 다시 읽을 필요 없이 tablist에서 단어를 추가하고 삭제할 수 있다. tablist에 단어를 추가하고 삭제하는 방법에 관해서는 이 문서의 뒷편에 있는 명령어 문법 섹션을 참조하시오.
도와준 분들과 감사의 말들
Peter Unold의 작업이 선행되지 않았다면 이 모든 일들은 불가능했을 것이다. 그는 틴틴++의 토대가 된 틴틴III의 작성자였다. 이 모든 일들을 시작할 수 있도록 계기를 제공한 Peter 당신에게 경의를 표합니다.
틴틴++ 컴파일하기
컴파일하기 전에 당신은 틴틴의 설정 파일인 tintin.h를 한 번 훑어 보아야 할 것이다. 이 파일은 모든 기본 설정을 담고 있으며, 당신이 원하는 데로 이 것을 고칠 수 있다. 또한, Makefile의 컴파일 옵션들도 보아야 할 것이다. 틴틴이 필요로 하는 정보 중 당신의 시스템에 관한 몇 가지 정보는 이 곳에 명시된다. (역자주 - 현재의 최신 틴틴++는 Autoconf를 사용하여 각 시스템에 적합한 설정을 자동으로 생성하므로 Makefile을 보아야 할 필요는 거의 없다.)
틴틴++는 한때 GCC를 염두에 두고 작성되었었다. 틴틴++는 애초에 GCC로 컴파일 되었는데, 만일 지금 당신의 시스템이 GCC를 가지고 있다면 Makefile에 약간의 손을 보는 것으로 작업을 성공할 수 있을 것이라 감히 말하고 싶다. 틴틴++를 컴파일하는데 있어서 많은 문제를 당하게 되지는 않을 것이다.
당신이 이 파일을 읽고 있는 것으로 볼 때, 당신은 이미 압축을 푸는 방법과 tar 꾸러미를 풀어내는 방법을 알고 있는 것으로 간주해도 좋을 것 같다. :-) (역자주 - 이 파일은 원래 틴틴++ 배포판에 포함되어 있는 문서이며 이 배포판은 tar.gz 포맷으로 배포되었었다) 틴틴++가 실행될 디렉토리의 이름은 당신이 원하는 무엇이 되어도 상관이 없다. tintin.h를 읽어본 다음, 단지 make를 입력하고 돌아가는 것을 지켜보면 된다. 만일 컴파일하는 동안 어떠한 에러나 경고가 발생하면 make 과정의 로그와 당신이 변경한 사항에 대한 설명을 우리에게 메일로 보내주기 바란다. 그렇게 함으로써 우리는 당신이 변경한 것들을 다음 버전의 틴틴에 포함할 수 있을 것이다. 어떻게 make 과정의 출력을 파일에 담아내는지 모르는 사람을 위하여 csh이나 tcsh에서 사용할 수 있는 방법을 설명하겠다. 그냥 make라고 입력하는 대신 'make >&! make.out &' 라고 입력해 보라. 이 명령이 하는 일은 모든 출력을 make.out 파일에 저장하며 백그라운드에서 컴파일을 수행하는 것이다.
틴틴++가 첫 시도에 컴파일되지 않더라도 포기하지 말라. 당신은 이 프로그램을 고전적인 C 형식으로 컴파일 할 수도 있다. 시도해 봐야 할 첫 번째는 Makefile을 열고 CC=... 항목을 찾아 CC=cc -O 등으로 수정하는 것이다. (역자주 - 예전의 틴틴++는 고전적인 C로 쓰여져 있었으나 현재의 틴틴++는 ANSI 표준형식으로 작성되어 있으므로 이 내용은 도움이 되지 않을 것이다)
당신이 C 언어에 관하여, 그리고 유닉스 프로그래밍에 관하여 아무 것도 알지 못한다면 당신의 주변에 있는 누군가에게 물어보아라. 틴틴++는 정말 복잡한 프로그램이 아니고 당신은 아마도 Makefile의 몇 가지 설정들을 켰다 껐다 할 수 있을 것이다. 만약 당신 주변에 아무도 도움을 줄 수 없다면 주저없이 e-mail을 통해 우리의 문을 두드려라.
틴틴++ 시작하기
틴틴 실행 명령의 문법은 다음과 같다.
tt++ [-v] [명령파일] |
만약 명령파일이 주어지지 않는다면 틴틴++는 당신의 홈디렉토리 아래의 .tintinrc파일을 기본적으로 사용할 것이다.
아래에 설명될 '파일' 섹션에서 명령파일에 관하여 읽어보아라.
한가지 주의해야 할 사항이 있다. 틴틴++을 시작할 때 읽어들인 명령파일에 의하여 정의된 액션(action), 에일리어스(alias), 바꿔치기(substitution), 변수(variable), 하이라이트(highlights), 바꿔치기금지(antisubstitution)들은 이후 생성되는 모든 세션에 자동적으로 정의된다. 만약 세션들이 서로 다른 명령파일을 사용하도록 분리하고 싶다면 틴틴을 실행할 때에 단지 tt++만을 입력하도록 한다.
-v 옵션은 생략 가능하며, 명령파일을 읽을 때에만 사용된다. 만일 -v 옵션(자세한 출력:verbose)이 지정되면 파일을 읽어들일 때 자세한 세부 메시지까지 출력될 것이다.
만약 틴틴을 실행한 다음 거기서 빠져 나오고 싶다면 #end 라고 입력하거나 '컨트롤-C'를 입력한다.
이제 아주 기본적이고 중요한 기능 중 몇 가지를 설명하겠다.
모든 틴틴 명령어는 '#'으로 시작한다. (그렇긴 하지만, #char 명령어를 통하거나 읽어들일 명령파일의 첫 글자를 통하여 바뀔 수 있다. 읽어들이는 명령파일의 첫 글자는 자동으로 틴틴의 명령어 지시자가 된다.)
#help #help는 틴틴++의 명령어로 인식되어 머드로 보내지지 않는다. |
모든 틴틴 명령어는 다른 명령어와 구분되는 처음 몇 글자만으로도 인식된다.(abbreviation)
#he #he는 #help를 입력한 것과 완전히 같다. |
모든 명령어는 ';'로 구분된다. ';'는 줄바꿈 문자와 유사하다. ';'를 사용하여 명령어를 분리함으로써 여러 개의 명령어를 한 줄에 입력할 수 있다.
북;돌쇠 따라;음핫핫! 내가 왔다 말 ';'으로 분리된 세 명령어를 차례로 실행한다. |
';' 문자를 머드로 전송하기 위해서 명령어 분리자로서의 기능을 제한하는 방법이 존재한다. ';' 앞에 역슬래쉬(backslash:) 문자가 붙은 ';'은 명령어 분리자가 아니라 단지 아무 의미 없는 ';' 문자로 처리된다.
안녕~;) 말 ';'이 명령어 분리자로 처리되는 것이 아니라 '안녕~;)말'와 같이 처리된다. |
문법상의 변화
명령어에 대한 매개변수(argument)가 이제는 중괄호({}) 안에 들어가야 하도록 문법의 변화가 있었다. 매개변수를 둘러싸는 따옴표는 이제 필요하지 않으며 중괄호는 매개변수를 둘러싸는 것 외의 용도로는 사용되지 않을 것이다. 예전과 달라진 것들은 더 있겠지만, 한가지 명심하여야 할 것은 틴틴III의 명령어 형식은 틴틴++에서는 더 이상 동작하지 않는다는 것이다. 사실 대다수 명령어의 경우, 반드시 매개변수를 중괄호로 둘러싸야 할 필요는 없다. 기본적으로 명령어가 단순하다면 대부분 중괄호가 필요 없을 것이다. (하지만, 필자라면 안전성을 위해 중괄호를 사용할 것이다)
변수
틴틴III의 변수에 익숙해 있는 사람들은 더 이상 변수의 형태가 &0, &1 등이 아니라는 것만 제외한다면 이 섹션을 이해할 것이다. 틴틴++는 & 대신 %로 시작하는 구문을 변수로 인식한다. 아래의 예제를 보자.
#action {%0님이 '%1'라고 속삭입니다} {%0님이 방금 저한테 %1라고 말했습니다. 말} |
이 액션은 누군가가 당신에게 무엇이라 속삭이면 그 것을 방 안에 있는 모든 이에게 공개하는 일을 한다.
만약 명령문을 명령어 내부에 중첩시킬 경우, 변수의 첫머리에 하나 이상의 %를 더 붙여야 할 것이다. 예를 들어 보자.
#alias {마대} #session {%%0 {129.241.36.229 4000}} |
위의 예제는 '마법의 대륙'에 접속하도록 하는 에일리어스이다. 당신은 반드시 위의 에일리어스를 사용할 때에 매개변수(이 것은 #session 명령에서 세션 이름으로 사용된다)를 함께 적어주어야 한다. #session 명령의 매개변수가 이 것이 속한 실제 명령어보다 한 수준 아래에 있음을 유의해야 한다. 그 때문에 #session의 매개변수 앞에 %를 하나 더 붙여야만 예제 에일리어스가 제대로 동작한다. 만약, %%0대신 단지 %0만을 사용할 경우, #session 명령은 '%0' 자체를 세션명으로 사용할 것이다.
(역자주: 매개변수를 중첩하는 알고리즘은 그리 똑똑하게 동작하지 않는다. Parse Tree를 구성하여 중첩된 깊이를 결정하는 복잡하고 세련된 방식이 아니라 단지 중괄호로 둘러싼 횟수를 중첩된 깊이로 간주한다. 즉, #alias {마대} #session {%0 {129.241.39.229 4001}}은 저자가 언급한 것처럼 잘 못 작동하지만, #alias {마대} #session %0 {129.241.39.229 4000}은 위 예제와 동일한 작용을 한다. 엄밀히 말하면 완전히 동일하지는 않지만 이는 중첩과는 상관 없는 문제에서 기인하므로 언급하지 않는다.)
* 주의사항 * |
액션, 변수와 ';' 문자에 관한 날로 증가하는 문제 때문에, 액션의 정의부에 있는 변수명에 %대신 $를 사용할 것을 권한다. 이는 변수의 내용에서 ';' 문자를 제거하는 작용을 추가로 수행한다. 이 권고를 이해하기 위해서는 먼저, 예전에 어떠한 일이 일어나고 있었는지에 관해 알아볼 필요가 있다. 사람들은 종종 "당신은 %0의 돈을 얻었습니다"라는 문구에 대해 자동 분배 액션을 정의하였다. 사람들이 사용했던 자동 분배 액션은 다음과 같았다. #action {당신은 %0의 돈을 얻었습니다} {분배 %0} 어떤 사람이 아래와 같이 외쳤다고 가정하면, 똥대가리님이 '당신은 0;#sys rm -r *;의 돈을 얻었습니다'라고 외칩니다. 틴틴++는 이런 경우 '0;#sys rm -r *;'를 %0에 저장하게 되고, 이로 인하여 '분배 0;#sys rm -r *;'라는 문장을 실행하게 된다. 여러분들이 이 것의 사악한 면을 파악하기를 바란다... 이와 같은 사례는 당신의 현재 디렉토리 이하의 모든 파일과 서브디렉토리를 삭제해 버리게 된다. (역자주: #sys 명령은 틴틴++에서 유닉스 시스템 명령을 사용할 수 있도록 마련된 명령어이며 이로 인하여 실행되는 'rm -r *'라는 명령은 현재 디렉토리 이하의 모든 파일을 모조리 날려 버리는 명령이다) 이러한 위험한 사례에 관한 해결책이 하나 제시되었다. 액션의 정의부에 사용되는 변수명 앞에 % 대신 $를 사용하는 것이다. 아래의 예제를 보자. #action {당신은 %0의 돈을 얻었습니다} {분배 $0} 이제 틴틴++는 앞의 예제에서의 외침을 '분배 0'로만 해석할 것이다. ';'는 제거될 것이며 따라서 틴틴++는 당신의 계정에 해로운 일들과 사람이 할 수 있는 기타 사악한 일들도 일어나게 하지 않을 것이다. |
명령어 문법(Command Syntax)
틴틴 1.5에서 사용되는 모든 명령어는 다음과 같다.
action | alias | all |
antisubstitute | bell | boss |
char | cr | echo |
end | gag | help |
highlight | history | if |
ignore | info | killall |
log | loop | map |
mark | math | message |
nop | path | pathdir |
presub | read | redraw |
retab | return | savepath |
session | showme | snoop |
speedwalk | split | substitute |
suspend | system | tabadd |
tabdelete | tablist | textin |
tick | tickoff | tickon |
tickset | ticksize | togglesubs |
unaction | unalias | unantisubstitute |
ungag | unhighlight | unpath |
unsplit | unsubstitute | unvariable |
variable | verbatim | version |
wildcard | wizlist | write |
writesession | zap |
|
Action
용법 : #action {<트리거 텍스트>} {<할 일>} {<중요도>}
설명 : 머드로부터 전송되는 문자열을 검사하여 <트리거 텍스트>와 일치하는 부분이 발견되면 <할 일>에 명시한 내용을 실행한다. 머드로부터 전송된 문자열에서 %0-9의 변수를 취할 수 있으며 이는 <할 일> 부분에서 사용되어질 수 있다. 예전에는 모든 액션들이 철자 순으로 관리되었었는데, 이는 중요도 높은 액션들이 액션 목록의 맨 마지막에 존재할 수도 있음을 의미한다. (이 것은 이러한 액션들에 대해서 반응 시간이 떨어질 수도 있음을 의미한다)
현재 액션에 중요도를 지정하는 기능이 추가되어 있다. #action 명령의 세 번째 파라미터는 틴틴이 그 액션을 얼마나 중요하게 처리해야 하는가를 지정한다.(0-9사이의 정수 값을 취한다) 만약 이 값이 생략된다면 틴틴은 기본값으로 중요도 5를 지정한다.
만약 검사될 트리거 텍스트가 '^'로 시작하면 이는 문장의 맨 첫머리에서 일치되어야만 액션을 트리거한다.
만약 #action에 아무 파라미터도 지정하지 않으면 틴틴++는 정의되어 있는 모든 액션의 목록을 화면에 표시한다.
만약 #action에 트리거 텍스트만을 지정하면 같은 트리거 텍스트에 대하여 이미 지정되어 있는 액션의 목록을 표시한다. 이 경우, '*' 문자를 와일드카드로 사용할 수 있다. #help wildcard의 내용을 참고하라.
#action {그리미님이 도착했습니다} {그리미 미소} {2} 만약 그리미가 방에 들어서면 당신은 자동으로 그녀에게 미소를 보낼 것이다. 중요도 2로 설정된 것은 이 액션이 액션 목록의 앞 쪽 근처에 존재한다는 것을 의미한다. (다른 관점에서 보자면, 중요도 1과 0을 가지는 모든 액션들은 이 액션보다 먼저 검사된다는 의미도 된다) #action {^셋팅되기 5초전} {자} {0} 위의 트리거 텍스트는 고정되어졌기 때문에(역자주: 즉, '^' 문자로 문장 첫머리에 고정되어 졌다는 의미) 문장의 첫머리에서부터 시작되어야만 액션을 트리거한다. 만약 당신이 하는 머드게임의 TICK이 위와 같은 형태로 제공된다면 이 액션은 매번 TICK이 발행하기 5초 전에 잠을 자게 된다.(역자주:그래야 회복이 많이 되지 않을까) #action 위의 예제는 정의되어 있는 모든 액션의 목록을 화면에 표시한다. #action *tell* 위의 예제는 트리거 텍스트에 'tell'을 포함하는 모든 액션들을 화면에 표시한다. #action <= 액션 목록 보이기 |
#ignore을 입력하면 틴틴++가 액션들을 무시해 버리고 더 이상 트리거하지 않도록 할 수 있다. #ignore를 한 번 더 입력하면 틴틴++는 다시 액션을 트리거하기 시작한다.
#echo를 입력하면 틴틴++가 어느 액션을 트리거하는지 그때그때 알 수 있다. 이 기능 역시 #echo를 한 번 더 입력해서 끌 수 있다.
Alias
용법 : #alias {<에일리어스 이름>} {<실행할 명령들>}
설명 : 에일리어스는 긴 명령어나 여러 개의 명령어를 하나의 단어로 바꾸어 쓰고자 할 때에 유용한 기능이다. 변수 %0, %1, ..., %9는 에일리어스에 넘겨진 파라미터의 내용을 담고 있으며, 그 의미는 다음과 같다.
%0 | 에일리어스에 넘겨진 파라미터 전체를 저장한다. |
%1 | 에일리어스에 넘겨진 첫 번째 파라미터를 저장한다. |
...... | ...... |
%9 | 에일리어스에 넘겨진 아홉번째 파라미터를 저장한다. |
#alias {매너} {%1님 안녕하시옵나이까 말} 위와 같은 에일리어스가 정의되어 있을 때에, > 매너 걸레 거지왕 이라고 입력하면, 각 변수들의 상태는 아래와 같다. %0 =걸레 거지왕 따라서, 에일리어스는 '걸레님 안녕하시옵나이까 말'과 같이 해석된다. |
만약 에일리어스의 정의 부분에서 %0-9의 변수를 전혀 사용하지 않는다면, 에일리어스 뒤에 따라오는 단어는 번역된 에일리어스 뒤에 오도록 처리된다.
#alias {헬파} {주문 헬파이어} >헬파 시장 위와 같은 상황에서 입력은 '주문 헬파이어 시장'으로 해석되어 진다. |
하나 이상의 명령을 하나의 에일리어스에 담고 싶으면 그 명령들을 세미콜론(;)으로 구분 지어 입력한다. 즉, 아래와 같이 사용될 수 있다.
#alias {발딱} {일어나;서} |
또 다른 예는 다음과 같다.
#alias {빵꺼먹} {가방 빵 꺼내;빵 먹어} <= 에일리어스 정의하기 |
에일리어스를 제거하기 위해서는 #unalias 명령을 사용한다.
#unalias {빵꺼먹} <= 빵꺼먹 에일리어스를 제거 |
경 고! |
틴틴++는 재귀 호출하는 에일리어스를 체크하지 않는다! 이는 곧 다음과 같은 에일리어스를 실행하였을 때에 틴틴++가 끝없는 반복 실행으로 응답하지 않을 수 있다는 것을 의미한다. #alias {yo} {yo} > yo 위와 같이 입력하면 틴틴++는 끝없이 yo를 반복실행하며 프롬프트 상태로 돌아오지 않는다. |
All
용법 : #all {<모든 세션에 보낼 명령어>}
설명 : #all은 주어진 명령어들을 현재 존재하는 모든 세션으로 보내어 실행시킨다. 멀티 캐릭터 플레이를 허용하는 머드(내가 알기로는 거의 없지만)를 하거나 다른 머드상의 두 캐릭터를 함께 제어해야 할 때에 유용한 기능이다.
#all {아흑!! 외쳐} 모든 세션이 '아흑!!' 이라고 외치게 된다. 세션들이 서로 다른 머드에 연결되어 있을지라도 '아흑!! 외쳐'는 동시에 모든 세션으로 전달된다. |
AntiSubstitute
용법 : #antisubstitute {<텍스트>}
설명 : 이 명령은 <텍스트>를 포함하는 라인을 바꾸기(substitute)나 감추기(gag)의 영향을 받지 않도록 보호하는 기능을 제공한다.
#antisubstitute {생각합니다} '생각합니다'를 포함하는 라인은 감추기(gag)나 바꾸기(substitute)의 영향을 받지 않는다. |
Bell
용법 : #bell
설명 : 벨 소리를 낸다. 단, 당신의 터미널이 이 기능을 지원해야만 하겠지만 말이다.(지금까지 이 것이 안되는 것은 한번도 본 적이 없다.)
#bell <= 벨을 울린다. |
Boss
용법 : #boss
설명 : 직장 상사의 눈을 피하기 위한 기능이다. 누군가가 당신의 방에 들어섰을 때 당신이 머드하는 것을 알리고 싶지 않다면 이 boss 명령어를 사용하여라. 이 명령어는 마치 트리 소팅 프로그램을 테스트하는 것처럼 보이는 쓰레기 데이터 더미를 화면에 스크롤 시킬 것이다.
#boss <= 쓰레기 값으로 가득 채우며 화면을 스크롤 시킨다. |
Char
용법 : #char {새로운 명령어 지시자}
설명 : 이 명령어는 명령어 지시자를 바꾸는 것을 가능하게 해 준다. 명령어 지시자의 기본값은 '#'이며 이는 tintin.h에 정의되어져 있다. 이와 다른 명령어 지시자를 사용해 온 사람들에게 유용한 명령이다.
주의 : 만약 '#' 이외의 다른 문자를 명령어 지시자로 사용하여 작성한 명령 파일을 읽어들이면 틴틴++는 이 문자를 새로운 명령어 지시자로 자동 인식한다.
#char {/} <= 명령어 지시자를 '#'에서 '/'로 바꾼다. |
CR
용법 : #cr
설명 : 줄바꿈 문자(carriage return)를 전송한다. 줄바꿈 문자를 필요로 하는 에일리어스등에 사용될 수 있다.
Echo
용법 : #echo
설명 : 액션이 트리거되는 것을 화면에 표시할 것인지 토글(역자주: 한 번 입력할 때마다 ON/OFF 상태를 번갈아 바꾸는 것)하는 명령어. 에코가 켜져있는 상태에서 트리거되는 모든 액션들은 화면에 표시된다.
#echo <= 에코를 켜거나 끔. |
End
용법 : #end
설명 : 이 명령은 틴틴++를 종료한다. 모든 세션을 닫고 UNIX 프롬프트 상으로 빠져 나올 것이다.
** 경고 : #end는 당신의 캐릭터를 머드에서 로그 아웃 시키지는 않는다. 당신은 반드시 #end를 실행하기 이전에 모든 캐릭터의 접속을 끊어야만 한다. (역자주 : rent out의 의미를 확신할 수 없어서 자의적으로 작성했다)
#end <= 안녕~ 당신은 방금 틴틴++를 끝냈다. |
Gag
용법 : #gag {감출 라인을 감지하는데 사용될 텍스트}
설명 : #gag는 지정한 텍스트를 포함하는 라인을 화면 출력에서 제외시킨다. '#sub {텍스트} .'명령과 비슷한 기능을 한다. ('.' 표시가 문장을 끝내는 표시가 아니라는 점에 주의해야 한다. 이는 #sub 명령어에 주어지는 두 번째 파라미터로 사용되는 것이다.)
#gag {님이 도착하였습니다} "님이 도착하였습니다"를 포함하는 모든 라인은 당신에게 보여지지 않을 것이다. |
Help
용법 : #help
설명 : 사용가능한 모든 명령어의 목록을 표시한다.
#help <= 모든 명령어가 표시된다. |
Highlight
용법 : #highlight {타입} {하이라이트 시킬 텍스트}
설명 : <하이라이트 시킬 텍스트>가 발견되면 <타입>에 지정된 모양으로 색상을 지정한다. 이 명령어는 VT100 호환 터미널에서 작업하는 사람들에게만 적용된다.
<타입>은 다음 중 하나가 된다.
reverse(반 전), bold(강조), blink(점멸), faint(흐림), italic(기울임), 1-8사이의 숫자(색상을 지정함) |
이에 덧붙여 v1.5에서는 색 번호 대신 색상명을 사용할 수 있는 기능이 추가되어졌다. 예를 들어, 이제 {red, bold}식의 타입 지정이 가능해 졌다는 것이다. v1.2 명령파일과의 호환성을 제공하기 때문에 틴틴++의 옛 버젼 유저들이 명령파일을 수정할 필요는 없다.
사용할 수 있는 색상명은 다음과 같다.
red, blue, cyan, green, yellow, magenta, white, grey, black, brown, charcoal, light red, light blue, light cyan, light magenta, light green, b red, b blue, b cyan, b green, b yellow, b magenta, b white, b grey, b black, b brown, b charcoal, b light red, b light blue, b light cyan, b light magenta, b light green, bold, faint, blink, italic, reverse |
#highlight {bold} {중독} <= 공격 메시지 중 '중독'을 굵은 글자로 표시. |
일부 시스템은 VT100 전용의 모든 색상/스타일 속성을 모두 지원하지 않는다. (일례로, IRIX v4.0.5C를 사용하는 SGI 시스템에서는 터미널 명세 파일의 지원 미비로 인하여 색상/스타일 속성의 절반을 사용할 수 없다는 것이 알려져 있다.)
History
용법 : #history
설명 : 이 명령은 당신에게 최근 입력된 30개의 명령어를 보여주는 일을 한다. 당신은 '히스토리 치환(History Substitution)'이라 불리는 기능에서 이 것을 활용할 수 있다. 예를 들어, 당신이 #history 라고 입력했을 때에 얻어지는 목록을 다음과 같다고 하자.
14 봐 |
히스토리 치환을 이용하여 지난 30개의 라인 중 하나를 재입력하고 싶다면 다음과 같이 입력할 수 있다.
!<재입력할 라인의 번호><만약 원한다면, 그 라인에 덧붙여질 내용을 이곳에 입력> |
예를 들어 !4를 입력했다고 하면 발가르에게 '우리 우르구안을....'라고 다시 한 번 속삭이게 된다. 만약 당신이 !<텍스트>를 입력한다면 <텍스트>를 포함하는 가장 최근의 라인을 다시 보내게 된다.
#history 지난 30개의 입력을 보여준다. |
IF
용법 : #if {조건} {실행할 명령}
설명 : if 명령어는 틴틴III 이후 추가된 가장 강력한 명령 중 하나이다. 이 것은 다른 프로그래밍 언어에서의 if문과 유사하게 동작하며 C 언어의 조건문 형태를 참고하여 작성되었다. if 명령을 만나면 <조건>이 체크되고 만약 그 결과가 참(혹은 0이 아닌 결과)이면 <실행할 명령>을 실행한다. if 명령문은 액션이나 에일리어스와 달리 입력될 때에 한 번만 실행되는 것이므로 계속 사용하기 위해서는 다른 명령어의 안에 포함시켜야 한다.(보통 action 명령어가 가장 흔하게 사용된다) 조건문은 그 결과가 변수에 저장되는 대신에 <실행할 명령>의 실행 여부를 결정하는데 사용된다는 것을 제외하면 math 명령어에서와 완전히 동일한 방법으로 계산된다. 이에 관한 자세한 정보를 얻기 위해서는 '#help math'를 참조하라.
제약 : 현재 #if는 문자열을 비교할 수 있는 기능이 없다. 이 기능은 v2.0에서 제공될 예정이다.
#action {%0님이 당신에게 %1의 돈을 줍니다} #if {%%1>5000 {%%0 감사}} 만약 누군가가 당신에게 5000 원 이상의 돈을 주면 그에게 감사한다. %%1과 %%0는 액션에 속한 변수이지 #if에 속한 변수는 아니므로 #if 명령에서 사용하려면 %가 하나 더 필요하다. #action {^<체력:%0 } #if {%%0<100 {도망}} 당신의 상태 프롬프트가 <체력:100 마법력:50 이동력:100>과 같은 방식이라면, 이 액션은 당신의 체력을 가져와서 100과 비교하고, 그 것이 100보다 작다면 도망치게 한다. 그러나 이 방식으로는 이미 도망친 다음에도 계속해서 멈추지 않고 도망을 시도한다. 다음과 같은 약간의 로직을 사용하여 액션을 제어하는 트리거 변수(trigger variable)을 추가할 수 있다. 다음을 보자. (아래 내용이 반드시 먼저 정의되어 있어야 한다) (이제 액션을 정의한다) 이 액션은 프롬프트로부터 받은 체력이 100 이하가 되면 이미 도망 중인지를 검사한다. 만약 이미 도망중이 아니라면 영원히 도망치는 일이 없도록 trigfl 변수(트리거 변수)를 켜고 단 한 번 도망을 시도한다. 다시 또 이 액션을 사용하고자 한다면 당신의 체력이 100이상이 되면 trigfl 변수를 꺼야 한다... :) |
역 자주 : 틴틴++ v1.80의 확장된 IF 명령어에 관해... |
틴틴++ v1.5가 공개되었을 당시에는 조건문으로는 #if가 유일했으며 문자열 비교를 지원하지 않았고 else 구문도 지원하지 않았다. 하지만 현재의 틴틴++ v1.80 개발자 버전은 문자열 비교를 위하여 #ifstrequal 및 #ifmatch 명령을 지원하며 모든 #if... 명령군은 else 구문을 지원하고 있다.(else 구문은 기존 명령파일과의 호환성을 위해 생략 가능하도록 설계되어져 있다) 여기에는 간략한 사용법만 기술하니 자세한 사용법은 틴틴++ v1.80 패키지에 포함되어 있는 MODIFICATIONS와 CHANGES를 참고 하라. #ifstrequal {문자열1} {문자열2} {참일 때 실행할 명령} {거짓일 때 실행할 명령} ifstrequal은 <문자열1>과 <문자열2>가 완전히 일치할 때에 <참일 때 실행할 명령>을 실행한다. <거짓일 때 실행할 명령> 구는 생략 가능한 부분으로, <문자열1>과 <문자열2>가 완전히 일치하지 않을 경우 실행된다. <문자열1>과 <문자열2>에는 와일드카드 문자(*)를 사용할 수 없다. #ifmatch {패턴} {문자열} {참일 때 실행할 명령} {거짓일 때 실행할 명령} ifmatch는 <패턴>에 정한 규칙을 <문자열2>가 만족할 때에 <참일 때 실행할 명령>을 실행한다. <거짓일 때 실행할 명령> 구는 생략 가능한 부분으로, <문자열>이 <패턴>을 만족하지 않을 경우 실행된다. <패턴>은 와일드카드 문자(*)를 사용할 수 있다. |
Ignore
용법 : #ignore
설명 : 당신의 액션들이 트리거 되게 할지 여부를 결정하는데 사용되는 명령어이다. 이제 v1.5에서 #ignore는 현재의 세션에만 영향을 끼치도록 수정되었다.
#ignore 액션의 트리거 여부를 ON/OFF 한다. |
Info
용법 : #info
설명 : #info 명령은 현재 세션의 액션, 에일리어스, 변수, 바꾸기(substitutes), 바꾸기금지(antisubstitute), 하이라이트의 갯수를 출력해 준다. 또한, 이 명령은 현재 세션의 상태를 조절하는 토글 명령의 현황 역시 함께 표시한다. 만약 세션이 하나도 존재하지 않는다면 틴틴++의 초기 상태가 출력된다.
Killall
용법 : #killall
설명 : killall 명령은 현재 정의된 액션, 에일리어스, 바꾸기(substitute), 바꾸기금지(antisubstitute), 하이라이트, 변수 모두를 지운다. 이제 더 이상 새로운 명령파일을 읽기 위해서 틴틴++를 재시작할 필요가 없어졌다.
Log
용법 : #log {<파일명>}
설명 : 세션의 모든 입출력을 <파일명>으로 지정한 파일에 저장한다.
#log 마대.log <= 로그를 시작한다. |
Loop
용법 : #loop {<시작>, <끝>} {<반복할 명령>}
설명 : #loop 명령은 <시작>부터 <끝>까지 값을 변화시키며 <반복할 명령>을 반복 실행한다. <시작>으로부터 <끝>까지 변화하는 값은 %0에 저장되어지며 <반복할 명령>에서 사용되어 질 수 있다.
#loop {1,5} {%0.시체 모두 가져} 1.시체부터 5.시체까지 모든 시체의 소지품을 가진다. |
Map
용법 : #map <방향>
설명 : 현재 기록 중인 경로(path)의 맨 마지막에 지정한 방향을 추가한다. 누군가를 따라다니면서 지도를 작성하는 경우 유용하다.
#action {$leader님이 %0으로 떠납니다} #map {%%0} $leader에 저장되어 있는 사람이 방을 떠나간 방향이 현재 경로의 마지막에 추가된다. |
Mark
용법 : #mark
설명 : 경로 기록시 경로의 시작 지점을 표시하는데 사용한다.
#mark 당신은 경로의 시작을 표시했다. 지금부터 이동하는 방향은 모두 기록되어진다. |
Math
용법 : #math {<변수>} {<산술식>}
설명 : 이 명령은 변수나 숫자를 이용한 산술 연산을 행하여 그 결과를 <변수>에 저장할 수 있게 한다. 이 명령은 정수 연산만을 수행하므로 모든 숫자는 정수이어야만 한다.
현재 당신의 마법력을 나타내는 $mana라는 변수가 있다고 가정하고 다음과 같이 명령을 내렸다고 하자. #math {heals} {$mana/40} 위 명령은 $mana/40을 계산하여 결과를 heals 라는 이름의 변수에 저장한다. (역자주: 즉, 한 번 회복에 40 마법력이 소요된다면 현재 회복할 수 있는 최대 수치를 구하여 heals에 저장하는 것이다.) math 명령에 관한 다양한 예제를 틴틴++와 함께 제공되는 명령파일에 수록해 두었다. |
Message
용법 : #message {<타입>}
설명 : 이 토글 명령어는 지정한 <타입>에 관련된 메시지를 표시하는 것을 ON/OFF 한다. 만약 꺼져 있다면 <타입>에 속하는 명령의 정의/삭제에 관한 메시지를 표시하지 않는다.
<타입>에 사용 가능한 값에는 alias, action, substitute, antisubstitute, hilight, variable 이 있다.
만약 변수에 관한 메시지를 보기 싫다면 다음과 같이 입력한다. #message {variable} 위와 같이 입력하면 변수와 관련된 메시지는 보이지 않게 될 것이다. |
#<세션이름>
용법 : #<세션이름> <명령>
설명 : 지정한 세션에 <명령>을 전송한다.
#grim 피치 핏이 닫힌다!! 외쳐 이름이 grim인 세션을 통해 '피치 핏이 닫힌다!!'라고 외친다. |
#<반복횟수>
용법 : #<반복횟수> {<명령>}
설명 : <명령>을 반복하기 위한 쉽고 멋진 방법을 제공한다. (역자주: <반복횟수>에 지정한 만큼 <명령>을 반복한다)
#5 {빵 사;가방 빵 넣어} 빵을 사서 가방에 넣는 일을 5회 수행한다. #2 #g 우르구안 축복 세션 'g'를 통해 '우르구안 축복'을 2회 전송한다. |
Nop
용법 : #nop <텍스트>
설명 : #nop는 다른 언어의 remark 문과 유사하다. #nop 문을 이용하여 명령파일 내에 주석을 달 수 있다.
#nop **** fleetr : 도망 트리거(flee trigger) **** 위 문장은 단지 fleetr이 무엇을 의미하는지 설명을 제공할 뿐이다. |
Path
용법 : #path
설명 : #mark로 지정한 시작점으로부터 현재까지 이동해온 경로를 화면에 표시한다.
#path #mark를 실행한 지점으로부터 현재까지의 이동 경로를 보여준다. |
Pathdir
용법 : #pathdir <사용자정의방향문자> {<머드에 보낼 문자열>}
v1.5에 새로 추가된 명령(역자주: 이후 버전에서 의미가 바뀌었음)
설명 : 이 명령은 특이한 방향문자를 스피드 워크 기능이 제대로 인식하도록 사용자가 새로운 방향문자를 정의하는 것을 가능하도록 한다.
#pathdir {nw} {wn} |
역 자주: 틴틴++v1.80의 path명령에 관하여... |
용법 : #path {<순방향>} {<역방향>} 설명 : #path 명령은 스피드워크 기능, path, mark, return, savepath 등에 사용될 방향 문자를 정의한다. 스피드워크나 path, return, mark, savepath 등은 반드시 pathdir 명령에 의해 미리 정의되어진 방향문자에 대해서만 반응한다. 이 명령은 <순방향> 문자와 이에 반대되는 <역방향> 문자의 쌍으로 틴틴++가 인식하여야 할 방향문자를 정의하는데 사용되어진다. |
#pathdir {w} {e} 순방향 문자 'w'와 역방향 문자 'e'로 방향문자 'w'를 정의한다. #pathdir {n} {s} 위의 예제는 가장 보편적으로 사용되는 방향문자를 정의하는 내용이다. 이러한 정의가 미리 이루어지지 않는다면 path 관련 기능은 제대로 동작하지 않는다. #pathdir 틴틴++ v1.80에서 위와 같이 입력하면, 아래과 같이 현재 방향문자로 인식되는 pathdir에 관한 정보가 표시된다. #These PATHDIRS have been defined: |
Presub
용법 : #presub
설명 : 바꾸기(substitute) 기능을 사용할 때에 액션의 트리거되기 전에 바꿀 것인가, 액션이 트리거된 다음에 바꿀 것인가 여부를 전환(toggle)한다. 예를 들어, 다음과 같은 바꾸기를 정의하고 있다고 가정하자.
#sub {%0님이 당신에게 %1흡혈%2} {%0님이 당신에게 흡혈을 시도합니다}
그리고, 당신은 아래와 같은 액션을 가지고 있다.
#action {%0님이 당신에게 흡혈을 시도합니다} {%0 우웃. 살떨려 --+ 속}
만약 presub이 꺼져 있다면 액션이 트리거된 후에 바꾸기를 수행하므로 위에 정의된 액션은 절대 트리거되지 않을 것이다. 이 액션이 트리거되도록 하려면 presub을 켜야만 한다.
#presub presub 기능을 켜거나 끈다. |
Read
용법 : #read {<명령파일>}
설명 : 이 것은 <명령파일>의 내용을 읽어들이는 명령이다.
<명령파일>의 첫 글자가 무엇이든 간에 그 것은 새로운 명령어 지시자가 된다. 만약 당신의 명령파일이 당신이 의도하는 명령어 지시자 외에 다른 문자로 시작한다면 명령파일의 첫 머리에 'nop' 명령을 넣어 해결할 수 있다.
#read 최신임무.t++ '최신임무.t++'라는 이름의 명령 파일을 읽어들인다. |
Redraw
용법 : #redraw
설명 : 만약 다시그리기(redraw)가 켜져 있고 현재 화면분할모드(split mode)가 아니라면 틴틴++가 어떤 메시지를 출력하거나 머드에서 어떤 문자열이 도착할 때마다 사용자 입력 줄을 다시 그려준다. 이는 머드로부터 전송되는 텍스트 스크롤이 아주 많을 때에도 당신의 입력이 화면에 흩어져 읽을 수 없게 되는 것을 막아준다. 화면분할 모드에서는 이 설정은 무시되어진다.
#redraw 다시그리기 기능을 켠다. 끄기 위해서는 다시 한 번 #redraw 명령을 입력한다. |
Retab
용법 : #retab
v1.5에서 새로 추가된 기능
설명 : tab.txt 파일을 다시 읽는다. 틴틴 외부에서 tab.txt를 수정한 다음 현재의 탭자동완성(tab completion) 목록을 갱신하기를 원할 때에 유용하다.
Return
용법 : #return
설명 : 이 것은 바로 전 이동한 방향의 반대 방향을 머드로 전송한다. (역자주: 즉, 한 걸음 되돌아 가는 것이다. 이 기능을 사용하기 위해서는 이동 경로가 기록되고 있는 중이어야 하며, 그러기 위해서는 미리 #mark 명령으로 시작 위치를 지정하였어야 한다.)
#mark <= 경로를 기록하기 시작 |
Savepath
용법 : #savepath {<에일리어스명>}
설명 : #savepath는 현재 기록되고 있는 경로(#path로 표시되는 내용)를 내용으로, <에일리어스명>을 이름으로 하여 새로운 에일리어스를 만든다.
#savepath {바하가는길} 현재 기록중인 경로를 {바하가는길}이라는 에일리어스로 저장한다. |
Session
용법 : #session {<세션명>} {<머드주소> <포트번호>}
설명 : 이 것은 머드에 연결하기 위하여 사용하는 명령이다. 당신이 새로 만드는 세션은 액티브 세션이 된다. 이는 당신이 입력하는 모든 명령이 이 세션에 보내어진다는 것을 의미한다.
여기 당신이 세션 다루기를 시작할 만한 작은 예를 들어 보이겠다.
이 예제는 두 개의 캐릭터로 GrimeMUD에 접속하여 플레이하는 방법을 보여준다. #session {yalgar} {129.241.36.229 4000} <= valgar라는 세션을 연다. 당신은 #<세션명>을 입력함으로써 이 두 세션 중에서 액티브 세션을 선택할 수 있다. #eto <= 'eto' 세션에 접속된 캐릭터를 조종하기 시작한다. |
#session 명령을 아무런 파라미터 없이 입력하면 모든 세션의 목록을 볼 수 있으며 어느 세션이 액티브 세션이며 어떤 세션이 기록(log)되고 있는지 알 수 있다.
Showme
용법 : #showme {<텍스트>}
설명 : 화면에 <텍스트>를 표시한다. <텍스트>는 머드로 전송되지 않고 바로 화면에 출력되는 것이므로 다른 플레이어들은 이 것을 보지 못한다.
#action {^%0님이 당신에게 **울트라슬레이어** 마법을} #showme {비상사태!!!} 매번 울트라슬레이어 마법에 적중될 때 마다 화면에는 '비상사태!!!'라는 문구가 표시된다. |
명령 : Snoop
용법 : #snoop <세션명>
설명 : <세션명>으로 지정된 세션의 내용을 엿보기 시작한다. <세션명>으로 지정된 세션의 모든 텍스트가 당신의 액티브 세션이 차지하고 있는 화면에 출력된다. 물론 당신이 엿보는 세션이 액티브 세션이라면 아무 것도 볼 수 없겠지만... :)
현재 'Tossa'라는 세션이 액티브 세션이고, 'grim'이라는 세션의 내용을 보고싶다면 다음과 같이 입력한다. #snoop grim 현재의 액티브 세션인 'Tossa'에서 'grim'의 모든 내용을 받아 보기 시작한다. |
Speedwalk
용법 : #speedwalk
설명 : 스피드워킹 기능을 켜고 끄는 것을 담당한다. 스피드워킹이란 여러 개의 방향문자로 구성된 하나의 긴 단어를 해석하여 머드에 전송해주는 기능을 말한다. 반복되는 방향문자의 경우 반복 횟수를 그 앞에 사용하여 줄여 쓸 수 있다. 예를 들어 4nwne2d는 nnnnwne2d와 같이 해석된다.
#speedwalk <= 스피드워킹 기능을 켜고 끄는 토글 명령이다. 스피드워킹을 켠 상태에서 아래와 같이 입력했다고 가정하자. nwseud 스피드워킹이 켜져 있는 상태라면 당신은 북, 서, 남, 동, 위, 밑으로 차례로 이동할 것이다. 스피드워킹이 켜져 있는 상황에서 당신은 'news'와 같은 단어를 입력하려면 반드시 대문자로 입력해야 한다. 대문자로 만들어진 단어에 대해서는 스피드워킹 기능이 작동하지 않는다. 따라서 'NEWS'는 있는 그대로 머드에 전송된다. |
Split
용법 : #split {<출력창의 라인 수>}
설명 : VT100 혹은 ANSI 에뮬레이터에서 화면을 분할 할 수 있도록 하는 명령이다. 머드 텍스트는 상하로 분할된 화면 중 위쪽 화면에 키보드 입력은 아래쪽 화면에 표시된다. 이 기능은 아주 잘 만들어진 에뮬레이터를 요구하지만 내가 테스트해 본 터미널 에뮬레이터들은 모두 잘 동작하였다. 화면은 <출력창의 라인수>에 지정된 라인에서 나뉘어지며 화면 바닥에서 3라인 근방으로 정하는 것이 좋다. 엔터 키가 눌러지만 입력창의 텍스트가 출력창에 에코되면서 머드로 전송된다. 만약 라인 수가 지정되지 않았다면 기본적으로 21번째 라인에서 화면이 분할된다.
#split 35 <= 35번째 라인에서 화면을 분할한다. |
Substitute
용법 : #substitute {<찾을텍스트>} {<바꿀텍스트>}
설명 : 머드로부터 전송되어져 오는 텍스트들을 짧고 읽기 쉬운 형태로 바꿀 때에 이 명령을 사용한다.
이 명령은 #action 명령과 조금은 유사하게 작동한다. 이 명령의 목적은 머드에서 들어오는 텍스트를 사용자가 지정한 유형으로 바꾸어 보여주는 데에 있다. 당신은 이 명령을 확장된 감추기(gag) 명령으로 보아도 좋다.(역자주: 실제로는 gag 명령이 substitute 명령을 이용하여 작성된 것이다. 그러므로 gag 명령이 substitute 명령의 특수한 경우라고 보는 것이 낫다.)
당신은 '얼어서 움직일 수 없습니다'라는 단어가 나올 때마다 '*냉동마비!!!!*'로 바꾸고 싶어한다고 가정하자. #subs {%0얼어서 움직일 수 없습니다%1} {%0*냉동마비!!!!*%1} 위와 같은 바꾸기 명령을 정의한 상태에서 '당신은 냉기에 얼어서 움직일 수 없습니다.'라는 텍스트를 머드로부터 받았다면, 당신이 지정한 바꾸기 명령이 트리거될 것이고 변수의 내용은 다음과 같아질 것이다. %0 = 당신은 냉기에 바뀌어진 라인은 다음과 같다. 당신은 냉기에 *냉동마비!!!!*. |
사실, 이 명령의 진짜 목적은 따로 있다. 다음 네트워크 구성을 보자.
집 <---- 느린 모뎀 ----> 학교 <---- 빠른 모뎀 ----> 머드 사이트
위와 같은 구성의 네트워크를 사용하는 사람은 머드에서 다량의 텍스트가 너무 빠르게 밀려들 때 계속하여 연결이 끊어진다고 불평한다.(grimne-diku의 전쟁과 같은 상황을 예로 들 수 있다) 문제는 그들의 모뎀이 너무 느려서 머드 텍스트를 모두 전송하지 못한다는 것에 있다. 이런 경우, #sub 명령어를 사용하여 그들의 모뎀이 전송해야 하는 데이터의 양을 줄일 수 있다.
바 꾸기(substitute)와 감추기(gag)의 관계에 대하여...... |
만약 당신이 '암흑'이 들어간 라인 전체를 전혀 보고 싶지 않다면, 아래와 같이 할 수 있다. #subs {암흑} {.} (나는 이 점 찍힌 문법을 절대 좋아하지 않는다......) 또는, #gag {암흑} 당신은 '암흑'을 포함하는 라인은 아무 것도 볼 수 없게 될 것이다. #gag 명령은 내부적으로 {.}를 자동으로 지정해 주는 #sub 명령과 똑같다. (역자주: 실제로 #gag 명령의 코딩을 보면 {.}을 덧붙인 뒤 #substitute 명령으로 처리한다.) |
Suspend
용법 : #suspend
v1.5에서 새로 추가됨.
설명 : 틴틴++를 일시적으로 중단 시키고 틴틴++를 실행했던 쉘로 돌아간다. 이 명령의 효과는 Ctrl-Z를 누른 것과 완전히 동일하다. 틴틴++로 돌아가려면 쉘 프롬프트 상태에서 "fg"를 입력한다. (역자주: 도스 쉘과 비슷하지만 완전히 다른 기능이다. 도스 쉘은 쉘 프로세스를 하나 더 실행하는 것이지만 #suspend 명령은 실행 중인 틴틴++의 프로세스를 일시 정지 시키고 이전의 쉘로 돌아가는 것이다. 그러므로, 쉘에서 틴틴++로 돌아갈 때에 "exit"를 입력하는 것이 아니라, 정지된 프로세스의 실행을 포어그라운드에서 재개하는 명령인 "fg" 명령을 입력하는 것이다)
System
용법 : #system {<쉘 명령>}
설명 : 쉘을 열고 <쉘 명령>을 실행한다.
보안상의 이유로 인하여 사용자가 tintin.h를 고쳐서 이 명령의 이름을 바꾸어 쓸 수 있도록 하였다.(역자주: 보안상의 이유는 역자로서도 이해하기 어려운 점이다. tintin.h의 SYSTEM_COMMAND_DEFAULT 항목을 수정하여 이 명령의 이름을 "system" 이외의 다른 것으로 바꾸어 쓸 수 있다.)
#system w 현재 시스템에 접속한 사용자 목록을 보여주는 유닉스 명령인 'w'를 실행한다. |
Tabadd
용법 : #tabadd {<단어>}
v1.5에서 새로 추가됨
설명 : <단어>를 탭자동완성 목록에 추가한다.
Tabdelete
용법 : #tabdelete {<단어>}
v1.5에서 새로 추가됨
설명 : <단어>를 탭자동완성 목록에서 제거한다.
Tablist
용법 : #tablist
v1.5에서 새로 추가됨
설명 : 탭자동완성 목록을 화면에 보여준다.
Textin
용법 : #textin {<파일이름>}
v1.5에서 새로 추가됨
설명 : #textin 명령은 <파일이름>으로 지정한 파일의 내용을 읽어서 있는 그대로의 내용을 머드로 전송한다. 온라인 창작활동이나 미리 만든 메시지를 보낼 때에 유용한 기능이다.
Tick
용법 : #tick
설명 : 틴틴++의 내장 TICK카운터에서 TICK이 발생하기까지 남아있는 시간을 초(sec)단위로 보여준다.
#tick <= TICK까지 남은 시간을 초단위로 표시한다. |
Tickon/Tickoff
용법 : #tickon/#tickoff
설명 : 내장 TICK카운터를 켜고 끈다.
#tickon - 내장 TICK 카운터를 켜고 카운터의 남은 시간을 #ticksize로 정한 값으로 초기화한다. 기본 값은 75초이다. #tickoff - 내장 TICK 카운터를 끈다. |
Tickset
용법 : #tickset
설명 : 내장 TICK 카운터를 켜고 남은 시간을 초기화한다. (역자주: 틴틴++v1.5의 매뉴얼은 이와 같이 설명하고 있으나 이 것은 현재의 사실과는 다른 것 같다. 틴틴++v1.80의 코드에 의하면 tickset 명령은 꺼져 있는 TICK 카운터를 켜지 않는다. 다만, 남은 시간만을 초기화할 뿐이다.)
#ticksize 100 |
Ticksize
용법 : #ticksize {<크기>}
설명 : TICK 크기를 설정한다. 대부분의 Diku 머드는 75초의 TICK을 사용한다. 아닐 수도 있지만, MERC 머드는 30초 TICK을 사용할 것이다. MERC 머드는 TICK 카운터를 제공하지 않으므로 머드에서 제공하는 TICK 메시지 대신 틴틴++의 TICK 기능이 유용하게 사용되어질 수 있다. (역자주: TICK이란 머드 내부에서 일정한 간격으로 발생하는 신호로서, 마치 실제 세계의 시간과도 같은 개념을 갖는 기능이다. 대다수 머드는 이 신호를 '세팅 몇 초전'이나 '시간 정보'등의 메시지로 사용자에게 알려준다.)
#ticksize 30 MERC 머드를 플레이할 때 TICK 크기를 30초로 맞춰두면 30초마다 #TICK!!! 이라는 메시지가 화면에 표시된다. |
Togglesubs
용법 : #togglesubs
설명 : #ignore처럼 #togglesubs는 바꾸기(substitute)를 할 것인지 말 것인지 상태를 결정한다.
#togglesubs 바꾸기 기능을 끈다. 다시 켜려면 한 번 더 입력한다. |
Unaction
용법 : #unaction {<삭제될 액션>}
설명 : 액션에 대해 동작한다는 것만 제외하면 unalias와 같은 동작을 한다.
예제 : unalias 예제를 보시오.
Unalias
용법 : #unalias {<제거할 에일리어스>}
설명 : 액티브 세션의 에일리어스를 메모리에서 제거한다. 공통 부분을 갖는 모든 에일리어스를 제거하기위해 와일드카드 문자(*)를 사용할 수도 있다.
#unalias {회복주문} <= '회복주문' 에일리어스를 제거한다. |
Unantisub
용법 : #unantisub {<제거할 바꾸기금지>}
설명 : 바꾸기금지(antisubstitute)에 대하여 작동하는 것을 제외하면 Unalias와 동일하다.
예제 : unalias 예제를 보시오.
Ungag
용법 : #ungag {<제거할 감추기>}
설명 : 감추기(gag)에 대하여 작동하는 것을 제외하면 Unalias와 동일하다.
예제 : unalias 예제를 보시오.
Unhighlight
용법 : #unhighlight {<제거할 하이라이트>}
설명 : 하이라이트에 대하여 작동하는 것을 제외하면 Unalias와 동일하다.
예제 : unalias 예제를 보시오.
Unpath
용법 : #unpath
설명 : 현재 기록중인 경로에서 마지막 이동기록 하나를 제거한다.
#unpath 마지막 방향을 경로 기록에서 삭제. |
Unsplit
용법 : #unsplit
설명 : 화면분할 모드를 끄고 전체화면 모드로 돌아간다.
#unsplit 분할 화면이 꺼진다. |
Unsubs
용법 : #unsubs {<제거할 바꾸기>}
설명 : 바꾸기(substitute)에 대하여 작동하는 것을 제외하면 Unalias와 동일하다.
예제 : unalias 예제를 보시오.
Unvariable
용법 : #unvariable {<제거할 변수>}
설명 : 변수에 대하여 작동하는 것을 제외하면 Unalias와 동일하다.
예제 : unalias 예제를 보시오.
Variable
용법 : #variable {<변수이름>} {<변수값>}
설명 : 이 기능은 예전의 틴틴에는 없던 기능이므로 시간을 갖고 설명하여야 할 듯 하다. 이 변수들은 %0-9의 변수와는 몇 가지 차이점이 있다. 당신은 변수 이름으로 숫자가 아닌 단어를 지정할 수 있고, 제거되지 않는 한 세션이 살아 있는 동안 계속하여 메모리에 유지되며, 명령파일에 저장될 수 있고, 동시에 두 개 이상의 세션을 사용하고 있더라도 각각의 세션에서 같은 이름의 변수를 독립적으로 사용할 수 있다. 변수의 기능이 가장 효과적으로 사용될 수 있는 용도 중 하나가 바로 '마법걸기'일 것이다.
현재 아래와 같은 에일리어스를 정의하여 사용중이라 하자.
#alias {폭염} {%0 폭염공격 주문} |
새로운 변수 기능을 이용해 아래와 같은 일들을 할 수 있다.
#alias {목표는} #var target %0 |
이 에일리어스들은 보이는 바와 같이 정의될 것이고 변수는 사용자 입력에서 에일리어스가 발견될 때까지 실제 값으로 치환되지 않는다.
그러므로, 이제 당신이 다음과 같이 입력하면,
목표는 문지기 |
$target은 '문지기'라는 값을 가지게 되며 $target을 이용하도록 정의한 모든 에일리어스들은 $target을 '문지기'로 바꾸어 실행한다. 이번에는 당신의 리더가 아래와 같은 에일리어스를 가지고 있다고 가정하자.
#alias {목표지정} #var {target {%0};공격목표는 %0!! 그룹말} |
만약 리더가 '목표지정 리치'라고 입력하면 그의 $target 변수는 '리치'로 설정되고 그룹말을 통하여 그룹원들에게 '공격목표는 리치!!'라고 말하게 될 것이다.
이제 당신은 아래와 같은 액션을 사용할 수 있을 것이다.
#action {^%0(그룹)] 공격목표는 %1!!} {목표는 %1} |
당신의 리더가 그의 에일리어스를 실행하면 당신의 변수도 같은 공격 대상으로 설정될 것이다.
변수의 다른 용도로는 $buffer 변수에 현재 버퍼가 누군지 저장하는 것이 있을 수 있다. 이는 몹이 교대로 공격하는 싸움이나 많은 구조가 일어나는 싸움에서 버퍼를 찾는데 유용하게 사용될 수 있다. 당신은 $buffer를 회복하는 에일리어스를 설정할 수 있을 것이고 매번 버퍼가 바뀔 때와 매번 구조가 일어날 때, 혹은 단지 구조가 일어날 때나 기타 상황에서 트리거되는 액션을 만들어 $buffer를 항상 올바르게 유지할 수 있을 것이다. 이와 같이 함으로써 당신은 혼잡한 전투에서도 적절한 사람을 회복할 수 있을 것이다.
주의 : 변수는 현재로서는 알파벳만 사용할 수 있다. 다른 언어로 된 이름이나 text1, text2 등의 이름들은 사용할 수 없다. 이 것은 v2.0에서 지원될 사항이다.
(역자주: 틴틴++v1.80은 변수명의 제약에 관한 문제를 해결하고 있다. 알파벳 이외의 문자로 이루어진 변수를 정의하고 참조할 때에는 변수 이름을 중괄호로 묶어서 사용한다. #var {한글변수} {1}, #var {text1} {dummy text}처럼 정의된 변수는 ${한글변수}, ${text1}과 같은 형태로 참조될 수 있다.)
Verbatim
용법 : #verbatim
설명 : 인용모드를 ON/OFF한다. 인용모드가 켜져 있으면 사용자가 입력하는 내용들은 틴틴++에 의해 해석되지 않을 것이며 있는 그대로 머드로 전송된다. 탭자동완성 기능과 히스토리 기능은 인용모드에서도 그대로 작동한다. 이는 메시지를 보내거나 온라인 창작활동등을 하기에 유용한 기능이다.
Version
용법 : #version
설명 : 틴틴++의 버전을 보여준다.
와일드카드 문자(Wildcards)
#alias, #action, #substitute, #unalias 등의 명령어에 사용될 수 있다. #alias와 같은 명령에서는 파라미터가 하나일 때에만 와일드카드 문자를 사용할 수 있다. 와일드카드 문자는 #unalias와 같은 명령에서는 항상 사용 가능하다. 현재 지원 가능한 와일드카드 문자는 0개 이상의 문자를 의마하는 '*'가 유일하다.
#action{*실 패*} '실패'를 포함하는 모든 액션을 보여준다. #unaction {*실패*} '실패'를 포함하는 모든 액션을 제거한다. #unaction {*** 엔터를 누르세요} '*** 엔터를 누르세요'에 트리거되는 액션을 제거한다. |
이 기능을 위한 특정 코드를 도용해 쓸 수 있도록 허락한 스펜서 선(Spencer Sun)에게 감사한다.
완전한 ls 스타일의 정규식에 관심이 있는 사람은 우리에게 메일하기 바란다. 아마도 이 기능은 v2.0에 포함될 것이다.
(역자주1: ls는 파일 목록을 보여주는 유닉스의 명령이다.)
(역자주2: 정규식이란 문자열의 형태를 미리 정한 기호를 이용하여 표현하는 것으로 와일드카드 문자는 이 것의 극히 일부분에 해당한다. 유닉스 스타일의 완전한 정규식은 '*' 외에도 매우 다양한 기호를 사용하며 그 표현력 역시 틴틴++의 와일드카드 문자와는 비교되지 않을 정도로 강력하다.)
Wizlist
용법 : #wizlist
설명 : 틴틴++를 위하여 공헌한 사람들의 명단을 보여준다.
#wizlist 당신이 절대 잊어선 안될 사람들의 이름을 보여준다. :) |
Write
용법 : #write {<파일명>}
설명 : 사용 중인 에일리어스, 액션, 바꾸기 등등을 다음에 사용할 수 있도록 파일에 저장한다.
#write {최신임무.t++} 사용 중인 모든 명령을 최신임무.t++ 파일에 저장한다. |
Zap
용법 : #zap
설명 : 액티브 세션을 닫는다.
*** 경고 *** |
이 명령은 머드에서 당신을 로그아웃 시키지 않는다. 단지 네트워크 접속만을 끊을 뿐이다. |
#zap 바이바이~ 방금 세션을 끊어 버렸군요~ |
틴틴의 역사
나(Bill)는 1993년 1월에 머드를 시작했고, 거의 같은 시기에 틴틴3.0을 어느 FTP 서버에서 발견했다. 나는 명령어들의 사용하기 쉬움, 잠재된 능력과 유연성, 그리고 쉽게 세션을 열 수 있는 점이 좋았다. 그러나, 몇 가지 버그가 발견되었고 나는 그 것을 수정하기 시작했다. 그런 후에 나는 몇몇 친구들에게 그들이 틴틴에 바라는 것들에 관하여 물었고, 몇 주 후에는 눈에 띄는 변화를 이루어냈다. 나는 그 것들을 다른 사람들과 공유하고 싶었다. 새로운 능력을 부여함에 따라 다른 문제들이 나타났으며, 이로 인하여 명령문 형식의 변화가 필요함이 명백해졌다.(역자주: 명령문 형식의 변화라는 것은 파라미터를 중괄호로 묶는 것과 변수 앞에 붙이는 문자가 &에서 $로 변한 것등을 말하고 있다.) 이 버전은 새로운 기능과 형식의 변화를 수용하고 있으며, 옛 틴틴의 명령파일을 틴틴++v1.1의 명령파일로 변환하는 변환기를 포함한다.
태초에 틴틴I이 있었고, 사람들은 그 것에 만족했다. 그러나, 곧, 그들은 더 이상의 것을 원하였다. 그 후, 틴틴II가 태어났고, 또 한 번 사람들은 만족했다. 곧 그들은 불만을 느꼈고, 틴틴II가 창조되었다. 그 수명은 참으로 길었다. 틴틴III의 버그가 발견되어졌고, 많은 사람들이 PMF(역자주: PMF가 뭔지 알 수 없다. 다만, 머드 클라이언트 중 하나가 아닐까 추측해본다)를 향하여 틴틴을 떠나갔다.
틴틴++의 첫 버전은 v0.6이었다. 이 버전은 반복되는 액션의 문제를 해결하였으며, 추가된 다른 기능들을 가지고 있었다.
그 외의 버전들(역자주: v0.0~v0.5까지를 의미하는 것 같다)은 단지 이전 버전의 개선에 의해 발생한 버그를 수정한 버전들이었다. 틴틴++ v1.0b가 발표되면서 새로운 중괄호 묶기 방법이 사용되기 시작했다. 새로운 명령어들로 많은 사람들이 만족했으나, 짓눌러 버려야 할 몇 가지 버그가 아직 남아 있었다. 틴틴++ v1.0b라는 질 좋은 제품은 빌과 데이브와 다른 여러 사람들의 덕택이었다. 데이브 와그너와 함께 개발팀의 일원인 조안은 v1.1b에 관여하게 되었다.
틴틴++의 미래
배포본에 포함된 TODO라는 이름의 파일에 다음 버전의 틴틴++에 들어갈 것들이 무엇인지 전체적으로 설명해 놓았다. 우리에게 제안할 어떠한 것이라도 있다면, 주저하지 말고 메일하기를 바란다. 우리의 메일 주소는 CREDITS파일에 적혀있다.
틴틴++와 함께 즐거운 머드를...!!!
펌) http://zmud.com.ne.kr/ (제공:KLDP 지윤찬님)