|
그대로 저장해놓은거 붙인거라서요. 제가 저한테 한말이니 반말로 되있더라도 양해해주세요.
제작 파란눈토끼 2004 6월에
이 문서는 눈퇴끼가 첮번째 머드에 관심을 가지고 c 언어에 익숙해짐과 알고리즘을 익히는데 목적이 있다.
필자가 머드를 접한것이 90년도 초반이었다.
맨처음 한것이 쥬라기 공원이었는데 한달 전화비가 당시돈으로 30만원이 나올정도로 중독성이 심했다.
채팅이라는것을 처음 보았고 여러사람이 협심해서 다니는 것과 레벨 시스템이 되어있었다.
그래픽이라고는 글자로 만든것이 전부였으며 모든것은 타이핑을 쳐서 일일이 하게 되어있는것이 바로 mud 게임이다.
멀티 유져 던전이라는것의 약자로 말그대로 여러사람들이 미로에서 일정한 스토리를 헤쳐 나가는것인데
이것의 매력은 역시 여러사람들이 접속 가능한것이 아닐까 생각한다.
알아본바로는 머드 게임에는 여러가지 종류가 있다. 90년대 초반 한참 머드게임이 유행할때 주로 제작된 언어가
c 이다 . 그것도 유닉스 c 이지. 왜냐면 소켓관련된 부분이 유닉스 gcc 에서 구현되기 쉽기 때문이다.
맨처음 머드게임을 창시한곳이 미국이다. 디쿠머드니 써클머드 mudos lpmud 등등 많은 종류가 쏟아졌는데
이것들은 모두 머드 엔진이다.
머드 엔진이란 무었일까. 우리가 만일 현대 차를 사서 신기종으로 계속 바꾸었다고 가정할때 엔진을 뜯어보면
같은 엔진일경우가 대부분이다. 껍데기만 편리하게 바꾸는것이지.
고로 기본 기능의 엔진만 있다면 계속 살을 붙여 완성한다. 대신 엔진 성능이 좋아야겠지.
필자가 관심을 가진 엔진이 mudos 인데 v22 버젼까지 나와있다. 이 엔진은 많은 기능을 가지고 있다. 어떻게 보면
옛날 gwbasic 시절 베이직 인터프리터라고 보면 된다. 인터프리터이다보니 실행파일 하나만 달랑 컴파일되고
lpc 라고 불리우는 c 파일로 바로바로 인터프리팅을 하여 실행결과를 보여준다. 필자는 일단 분석해보려고 뜯어
보았다가 머리아파서 다시 circle 머드로 바꿨다.
circle 머드는 완전 컴파일을 해야한다. 그래도 많은 개발자들이 아직도 이것을 가지고 만들고 있다.
그래도 필자는 mudos에대한 미련을 버리지 않았다. 일단 circle을 분석하고 mudos 에 대해 손을 볼것이다.
응용분야가 많기 때문이지. mudos 기반을 나처럼 개조해서 만든것이 hanlp 라는 엔진이다. hanlp.com 에 가면 많은
예제가 있다.
일단 미국 머드게임을 한글화 하는 과정에서 몇가지를 반드시 해줘야 된다.
1.조사 처리
누구누구 가(이) 무엇을 합니다. 라는 문장에서 '가' 인지 '이'인지를 분석해서 다시 뿌려줘야되고 을 인지 를 인지도
해줘야된다.
2.입력된 문장이 한글인지를 먼저 검사해야 위에것이 적용된다.
3.영문 2바이트를 한글 4바이트 문자를 받아들여 아이디등을 개설할수 있게 늘려줘야한다.
등등등 한글로 만드는것 자체가 짜증나는 작업이다.
먼저 분석대상은 sky 라는 써클기반 머드이다.
써클 3.0으로 되어있는데 써클이 3.1까지 나와있지만 그래도 누가 만들어놓은것을 분석하기위해서는 안정적으로 돌아가는
3.0으로 하겟다.
일단 한글처리에 관한것을 먼저하는데 다음은 새천사님이 쓴 글이다.
[Circle MUD로 MUD 게임 만들기:두번째 이야기]
Circle MUD 한글입출력 되게 하기
유후.... 즐거운 시간들 가지고 계신가요? 써클머드에 대해서 강좌를 하면서 내가
뭐하는 거지? 라는 생각을 하게 됩니다. 써클 머드의 경우는 많은 분들이 만드신 머드
를 공개를 해놔서 ... *^^* 각설하고 하기로 한것 까지 하겠습니다. 자 오늘 배울게
뭘까요? 한글입출력을 배워야 겠죠? 일반적으로 써클은 외국에서 만들어 졌기 때문에
한글의 대한 배려는 없습니다. 그래서 한글입출력을 하기 위해서 오늘도 배워 보겠습
니다. 무대뽀식 강좌 입니다. 잘 따라하세요.
>>1. int process_input(struct descriptor_data *t) 에서의 처리...
comm.c 를 편집기로 여세요. (원본 circle에서는 1777번째 줄로 찾아 갑니다.)
} else if (isascii(*ptr) && isprint(*ptr)) {
if ((*(write_point++) = *ptr) == '$') { /* copy one character */
*(write_point++) = '$'; /* if it's a $, double it */
space_left -= 2;
} else
space_left--;
}
}
이 부분을 다음과 같이 고치세요.
} else if ((isascii(*ptr) && isprint(*ptr)) || ishan(*ptr)) {
if ((*(write_point++) = *ptr) == '$') { /* copy one character */
*(write_point++) = '$'; /* if it's a $, double it */
space_left -= 2;
} else if (((unsigned char) *ptr) == 0xff) {
ptr++;
write_point--;
} else
space_left--;
}
}
-------------------------------------------------------------------------------
ishan(*ptr)이 늘어 났습니다. 이것을 정의해 줘야 겠죠?
utils.h 를 편집기로 여세요. (젤 아래쪽으로 갑니다.)
다음을 추가하세요.
/* 한글용 */
#define ishan(ch) (((ch) & 0xE0) > 0x90)
#define ishanasc(ch) (isascii(ch) || ishan(ch))
#define ishanalp(ch) (isalpha(ch) || ishan(ch))
#define isnhdigit(ch) (!ishan(ch) && isdigit(ch))
#define isnhspace(ch) (!ishan(ch) && isspace(ch))
ishan만 필요하지만 나중을 위해서 같이 넣은것입니다.
--------------------------------------------------------------------------------
이제 컴파일을 해보도록 하겠습니다. 컴파일을 마치고 나면 머드를 다시 실행해 주세
요. 아직까지 한글 이름은 안됩니다. 머드에 들어가셔서...
> say 메롱
You say, '메롱'
제대로 된것입니다. 오늘의 강좌는 여기까지 입니다.
예고: 다음강좌는 '한글아이디 입력받기'입니다.
그 다음은 '명령어를 한국형으로 파싱'입니다.
마지막은 '조사처리하기'입니다.
예고만큼만 강좌하고 무작정 따라하기는 마칠께요. *^^*
[Circle MUD로 MUD 게임 만들기:첫번째 이야기]
Circle MUD 한글 아이디 받기
오늘은 한글 아이디를 받는 부분을 배우기로 했습니다. 맞습니까? 아니면 말구 하하
썰렁하니까 그만하고 무작정 또 따라 해볼까요?
>> interpreter.c (1302번째 줄 void nanny)
if ((_parse_name(arg, tmp_name)) || strlen(tmp_name) < 2 ||
strlen(tmp_name) > MAX_NAME_LENGTH || !Valid_Name(tmp_name) ||
fill_word(strcpy(buf, tmp_name)) || reserved_word(buf)) {
write_to_output(d, "Invalid name, please try another.\r\nName: ");
return;
}
먼저 한글이냐? 라는 문장을 넣어 보겠습니다.
if ((_parse_name(arg, tmp_name)) || strlen(tmp_name) < 4 ||
!is_han(tmp_name) ||
strlen(tmp_name) > MAX_NAME_LENGTH || !Valid_Name(tmp_name) ||
fill_word(strcpy(buf, tmp_name)) || reserved_word(buf)) {
write_to_output(d, "Invalid name, please try another.\r\nName: ");
return;
}
뭐가 추가 됐나요? !is_han(tmp_name) || 부분이 추가 되었습니다. 그리고 2가 4로 바
뀌 었습니다. 그리고 MAX_NAME_LENGTH 를 찾아 10으로 바꾸세요. 그냥 저거 지우고 10
으로 써도 됩니다. *^^* 이제 원래 있던 부분중 _parse_name 을 바꿔 보겠습니다. 같
은 파일내에 1129 줄에 보시면 다음과 같은 것이 있습니다.
int _parse_name(char *arg, char *name)
{
int i;
skip_spaces(&arg);
for (i = 0; (*name = *arg); arg++, i++, name++)
if (!isalpha(*arg))
return (1);
if (!i)
return (1);
return (0);
}
이것을 다음과 같이 바꿔 보겠습니다.
int _parse_name(char *arg, char *name)
{
int i;
/* skip_spaces(&arg); */
for (; isnhspace(*arg); arg++);
for (i = 0; (*name = *arg); arg++, i++, name++)
if (!ishanalp(*arg))
return (1);
if (!i)
return (1);
return (0);
}
여기서 보시면 isnhspace 와 ishanalp 가 있습니다. 이건 전에 강좌에 추가 했습니다.
맞죠? 이젠 또 뭘 하면 될까요? 음... is_han 을 만들어야 겠네요. 음!
그냥 전체 적으로 만들어 버리죠. 자 보세요.
hangul.c 라는 파일을 만들어 보지요.
/* 한글처리용입니다. */
#include "kstbl.h"
int is_hangul(str)
unsigned char *str;
{
/* 순수한글인지 여부를 검사 */
if(str[0]>=0xb0 && str[0]<=0xc8 && str[1]>=0xa1 &&
str[1]<=0xfe)
return 1;
return 0;
}
int is_han(str)
unsigned char *str;
{
int i;
for (i = 0; i < strlen(str);i += 2) {
if (!is_hangul(str+i)) return 0;
}
return 1;
}
/* 받침이 있는지 없는지 검사하는 부분입니다. 조사처리에 쓰임 */
int under_han(str)
char *str;
{
unsigned char high, low;
int hightmp, lowtmp;
int len;
int found = 0;
len = strlen(str);
if(len < 2)
return 0;
lowtmp = str[len - 1];
len -= 2;
hightmp = str[len];
if(lowtmp > -1) {
while(len) {
len--;
if(len < 0)
break;
lowtmp = hightmp;
hightmp = str[len];
if((hightmp < -1) && (lowtmp < -1)) {
found = 1;
break;
}
}
} else
found = 1;
if(!found) return 0;
high = hightmp;
low = lowtmp;
high = KStbl[(high - 0xb0) * 94 + low - 0xa1] & 0x1f;
if(high < 2 || high > 28)
return 0;
return 1;
}
/* 첫글자의 초성을 찾는 부분입니다. */
char *first_han(unsigned char *str)
{
int i, Length;
char *Result = "ZZZ";
unsigned char str_0, str_1;
static unsigned char *exam[]={
"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ",
"ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ",
"ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ",
"ㅋ", "ㅌ", "ㅍ", "ㅎ", "" };
/* 이건 조합형으로 입력을 하셔야 합니다. */
static unsigned char *johab_exam[]={
"~Ha", "~La", "~Pa", "~Ta", "~Xa",
"~\a", "| a", "바", "빠", "사",
"싸", "아", "자", "짜", "차",
"카", "타", "파", "하", "" };
Length = strlen(str);
if (Length < 2)
return Result;
str_0 = str[0]; str_1 = str[1];
if (!is_hangul(&str[0]))
return Result;
str_0 = (KStbl[(str_0 - 0xb0) * 94 + str_1 - 0xa1] >> 8) & 0x7c;
for(i = 0; johab_exam[i][0]; i++)
{
str_1 = (johab_exam[i][0] & 0x7f);
if(str_1 == str_0)
return exam[i];
}
return Result;
}
-------------------------------------------------------------------------------
utils.h 에 저번에 쓴거 아래쪽에.
int is_hangul(unsigned char *str);
int is_han(unsigned char *str);
int under_han(unsigned char *str);
char *first_han(unsigned char *str);
-------------------------------------------------------------------------------
Makefile 을 고치겠습니다.
OBJFILES = act.comm.o act.informative.o act.item.o act.movement.o \
act.offensive.o act.other.o act.social.o act.wizard.o alias.o ban.o \
boards.o castle.o class.o comm.o config.o constants.o db.o fight.o \
graph.o handler.o house.o interpreter.o limits.o magic.o mail.o \
mobact.o modify.o objsave.o olc.o random.o shop.o spec_assign.o \
spec_procs.o spell_parser.o spells.o utils.o weather.o \
bsd-snprintf.o
CXREF_FILES = act.comm.c act.informative.c act.item.c act.movement.c \
act.offensive.c act.other.c act.social.c act.wizard.c alias.c ban.c \
boards.c castle.c class.c comm.c config.c constants.c db.c fight.c \
graph.c handler.c house.c interpreter.c limits.c magic.c mail.c \
mobact.c modify.c objsave.c olc.c random.c shop.c spec_assign.c\
spec_procs.c spell_parser.c spells.c utils.c weather.c \
bsd-snprintf.c
위에 보시면 bsd-snprintf.o 옆쪽에 hangul.o 입력하시고요. 아래쪽에서 마찮가지로
hangul.c를 입력 하세요.
-------------------------------------------------------------------------------
이제 다 된거 같네요.... 조사는 다음에 배울꺼니까. 일단은 만들어 두시고요.
필요한것이 kstbl.h 라는 파일이 필요합니다. 이건 자료실에 올리겠습니다. 받아서 사
용 하시기 바랍니다. 머드를 띄워서 확인하겠습니다.
By what name do you wish to be known? 새천사
Did I get that right, 새천사 (Y/N)? n
Okay, what IS it, then? newangel
Invalid name, please try another.
Name:
제대로 됐습니다. 이번주 강의는 급하게 만드니라고 조금 허접 하네요.
새천사
한가지 추가 할께요.
#include "conf.h"
#include "sysdep.h"
를 hangul.c 처음 부분에 넣어주세요.
interpreter.c 를 연 후
void skip_spaces(char **string)
{
for (; **string && isspace(**string); (*string)++);
}
를 찾아서
void skip_spaces(char **string)
{
for (; **string && isnhspace(**string); (*string)++);
}
이렇게 고쳐줍니다.
그렇지 않을 경우 일부 한글이 스페이스로 인식되어 삭제되는 엄청난 사태가 벌어질 우려가 있습니다 ;;;
src 디렉토리로 들어가면 소스들이 보이는데 이중에서 interpreter.c 파일을 먼저 분석해본다.
1440 번째줄에 보면
if ((_parse_name(arg, tmp_name)) || strlen(tmp_name) < 4 ||
!is_han(tmp_name) ||
strlen(tmp_name) > MAX_NAME_LENGTH || !Valid_Name(tmp_name) ||
fill_word(strcpy(buf, tmp_name)) || reserved_word(buf)) {
SEND_TO_Q("Invalid name, please try another.\r\n"
"Name: ", d);
이런 문장이 있다. 이것은 이미 개조된것이다. 파싱을 하는것인데 입력된문장을 분석하는것이다.
입력된문장이 원래 2 바이트보다 작으면이었지만 한글을 넣어야되므로 넉넉하게 4바이트로 바꾸었다.
그러므로 영문은 2글자이상이었다가 4글자이상으로 입력해야되고 한글은 반으로 줄어들므로 2글자 이상 넣어야된다.
그리고 두번째줄에 보면 없던 함수인 is_han 함수가 보인다.한글인지를 검사하는것이다. 이중에
하나라도 통과하지 못하면 다시 입력해야된다. 이부분은 로그인할때 적용되는부분이다.
근데 잘보면 로직이 이상하다. 만일 한글이 아니면 무조껀 잘못된 에러메세지를 뿌려주게 된다.
결국 영문이름은 지을수 없다는 말이 되는것이다.
interpreter.c 의 역할
---------------------------------------------
사용자 로그인과 새 아이디 생성에 관한 것과 명령어 처리에 관한 인터프리팅을 한다.
명령어를 선언하는데 행동에 관한 추가 함수들에 대한 선언이 act.other.c 에 정의되어있다.
명령어 추가를 그곳에 하면 된다.
act.other.c 에 보면 정의된 함수안에 또 쓰고있는 함수는 handler.c에 정의 되어있다.
함수들이 원래것보다 더 개조되어있으니 잘봐야된다. handler.h 에 정의된 함수들도 같이 고쳐주고.
고치게 되면 이 함수를 쓰는 모든 곳을 손봐야된다.
예를 들자면 act.comm.c 에서 도 아래 함수를 쓰는데 함수를 고쳤으므로
if (!(paper = get_obj_in_list_vis(ch, papername, NULL, ch->carrying))) { 를
if (!(paper = get_obj_in_list_vis(ch, papername, ch->carrying))) {
식으로 바꿔야한다.
structs.h의 역할
--------------------------------------------------
플래그 ( 행동이나, 상태들) 에 대한 숫자로 된 정의 파일
config.c
--------------------------------------------------
포트 번호 ,자동 저장 시간 등등
처음 들어갈때 선택 화면과 환영 메세지를 보여준다.
lib\world\wld\30.wld 파일
-----------------------------------------
처음 들어가면 보이는 신전방에 대한 묘사이다.
lib/world/obj/30.obj 파일
------------------------------------
해당 방에 있는 물건들을 묘사한다.
지도 시스템 분석
------------------------------------
wld/30.wld, obj/30.obj,
mob/30.mob, zon/30.zon , shp
이런식으로 셋트이다. wld 파일은 방묘사파일,obj 는 방에 들어있는 떨어져있는 물건들,mob파일은 해당
방에 기본들어있는 몬스터, zon파일은 방번호에 들어있는 아이템들을 나타내는것 같다.
그러므로 하나를 만들면 반드시 이 네가지를 만들어줘야된다.
wld 파일은 해당 방파일 번호에 대한 묘사와 다른방으로 가는 링크를 정의한다.
obj 파일은 무기,갑옷,보물 그리고 다른 플레이어와 몬스터들에 의해 조작된목적물등을 정의한다.
가게 파일(*.shp)은 그들이 사고 팔고 말하는 것을 컨트롤하면서 theMUD의 가게 주인을 정의한다.
가장 중요한 파일은 zone 파일인데 이것이 로드 될때 다른 요소들을 함께 가져오는것 같다.
머리속으로 이런것들을 계산하면서 맵을 만드는것은 힘들기때문에 bin 디렉토리에 윈도우용을 위한
프로그램을 어렵게 구해서 넣었다.
존한개에는 약 100개의 방이 만들어진다. 왜인지 분석해봤더니 이렇게 나뉘더라
예를 들어 30.zon 과 그일당 파일들이 있다면 방번호부여가 자동으로 3000부터 3099 까지 부여되는것 같다.
다른예로 41.mob 파일이 있다면 방이 4100부터 4199 까지 되는것이지 언더스탠드?
그럼 9.zone 파일이 있다면? 900부터 999까지 것지?
그리고 각 wld 디렉토리,mob 디렉토리 등등에 보면 index 파일과 index.mini 파일이있다.
index 파일에는 이 디렉토리의 구성은 이렇게 되어있다는것을 인덱싱한다.
그리고 부팅할때 간략한 setof 파일로 되는 index.mini 파일이 있다.
이 mini파일은 접속순서대로 3가지의 파일이 등록되어있는데 결국 맨마지막 밑 파일이 중요하다.
그리고 모든 파일을 보면 맨 밑에 $ 표시가 있다. 이것이 있어야 정상적으로 부팅이 된다.
아마 만들때 끝을 구분하기 위해서 그렇게 한것 같다. 아래 예제가 있다.
1 a DIRTY 방이 더럽다.
2 b STINKY 악취가 난다.
4 c MUSHY 바닥이 물렁하다.
8 d SWAMPY 늪같다.
보면 4개의 테이블 칸 이 있다. 가로로 4개지
첮번째 숫자가 의미한는것은 숫자플래그이다.
두번째 칸은 알파벳암호 플래그이다.
세번째칸은 플래그의 이름이고 네번째것은 플래그의 설명이다.
위의 테이블을 가지고 bitvector을 만들수 있는 방법은 두가지이다.
숫자처리방법과 알파벳처리 방법이다.
숫자처리방법은 예를 들어 설명한다.
방을 더럽고 악취나는 방으로 정의 하고 싶을경우는 어떻게 할까?
바로 좋은 방법이 더하는거다. 1번 더럽다와 2번 악취난다를 더하면 3이지?
그럼 이방의 비트벡터가 3이되는거지
그럼 악취나고 늪같고 물렁한 방을 만들려면? 악취 난다의 2와 늪같다의 8 과 물렁 4 을 더해서
14다 14가 이방의 플래그가 되는것이지.
알파벳처리 방법은? 그냥 쉽게 두번째에 있는 알파벳을 붙이면된다. 그러므로 위의 예제를
알파벳처리로 바꾸면 악취 b+ 물렁 c+ 늪 d 를 하여 bcd 가되는데 주의할점은 대소문자를
구분하므로 반드시 지켜야한다.
몇몇의 비트벡터 테이블은 저러한 방법을 쓰지 않는다. 월드파일에 저런것을
적용하지는 않기를 바란다.
백문이 불여일견 다음의 예제를 보면 이해가 빠르다.
ex) 만들려는 새로운 지역이 존 57번이라고 가정할것이고 이것에 대한 방과 물건들그리고 샵같은것
들이 당연히 5701부터 5799 사이로 되어있을것이다.
57.wld , 57.mob , 57.obj , 57.shp 그리고 57.zon 파일로 되있것지
각각의 디렉토리에 이 파일을 만든다.
그리고 각각의 디렉토리에 인덱스 파일을 만든다. 모두 5개의 인덱스 파일을 만들어야것지
인덱스파일에는 어떤 존파일들이 있는지 기술하면 된다.
lib/world/wld/index 에는 각 방파일들의 리스트를 넣어야된다.
맞는 수자인 57.wld 를 추가 해야지. 다음에는 다른 인덱스들도 해당 디렉토리에 생성해서 각각
파일명들을 같은 방식으로 추가한다.
이제 새로운 월드를 갖게 되었다.
머드를 실행할때 이 월드가 제대로 된 것인지 문장검사를 할수 있다. 이렇게
bin/circle -c 라고 실행하면 문법검사를 할수 있다. 문법검사를 한후 에러가 없을경우 올바른
실행이 된다.
-------------------------------------------------------
world 에서 룸 파일에 관한 분석 .wld 파일
1. 방의 형식
방의 형식은 다음과 같이 해야된다.
#< 가상번호>
<방이름>~
<방 묘사>
~
<zone 번호> <방의 bitvector> <구역 형식>
{0 또는 출구 /그리고 보조묘사}
S
출구는 0~6사이가 될수 있다.
가상번호는 이 world 파일에서만 쓰고있다.
출구까지 모두 기록했으면 끝에다 S 를 넣어야 이 방이 끝이 난다.
방의 bitvector 값 정의
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 a DARK 어두운 방.
2 b DEATH 죽음의 덪; char ``dies'' (no xp lost).
4 c NOMOB 맙(괴물)은 이방에 못들어옴.
8 d INDOORS 들어갈수만 있는방.
16 e PEACEFUL 평화로운 방 (폭력이 허락되지 않는).
32 f SOUNDPROOF 외침, 험담, 기타. 등등 이 들리지 않는 방.
64 g NOTRACK 이방에서는 길을 찾을수 없다.
128 h NOMAGIC 모든 마법이 이방에서는 실패한다.
256 i TUNNEL 한번에 한사람만 들어갈수 있는 방.
512 j PRIVATE 텔레포트로 들어올수 없거나 GOTO if two people here.
1024 k GODROOM 오직 LVL_GOD 와 이상만 들어갈수있다.
2048 l HOUSE 내부 사용 대비. 세팅 안함.
4096 m HOUSE_CRASH 내부 사용 대비. 세팅 안함.
8192 n ATRIUM 내부 사용 대비. 세팅 안함.
16384 o OLC 내부 사용 대비. 세팅 안함.
32768 p BFS_MARK 내부 사용 대비. 세팅 안함.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
아까전에 비트세트하는 법을 배웠으니 이해가 갈것이다.
<구역 형식>
0 INSIDE 방안에 갇힘 (움직이려면 소정의 움직임 점수가 필요하다).
1 CITY 한도시의 거리.
2 FIELD 열려있는 한 필드.
3 FOREST 울창한 숲.
4 HILLS 구름 낮게 깔린 언덕.
5 MOUNTAIN 가파른 산지형.
6 WATER_SWIM 물 (수영가능).
7 WATER_NOSWIM 수영불가능한 물 - 건너가려면 보트가 필요함.
8 UNDERWATER 물속.
9 FLYING 휙 날라감!
<출구와 보조묘사>
이 것은 나갈 를 정의한다. 형식은 아래와같다.
D<출구 번호>
<해당 출구에대한 일반 설명>
~
<키워드 목록>~
<문에대한 플래그> <키 번호> <연결된 방번호>
예를 들면 아래처럼
-------------
30 0 1
D1
아주 낡은 그런팅 뚱보 여관이 보입니다.
------------
라고 정의 되어있을경우 D1 은 출구이고 "아주 어쩌구"하는 문구는 보조묘사이다.
그러니 둘은 셋트라고 봐야것지. 물론 보조묘사는 안써도된다.
그렇다면 D1의 뜻은 뭘까
출구에 대해 알아보면 D 는 (Direction nmber) 이라는 를 나타낸다. 여기에는 곧바로
따라오는 방향표시가 있는데 숫자로 나타낸다.
0 - 북 ,1 - 동, 2 - 남 , 3 - 서 , 4 - 위 , 5 - 밑
보조묘사 는 이럴때 쓴다.
북 봐 ,동 봐 하는 명령어를 쓸때 "특별한것이 없습니다." 아니면 뭐가 보입니다. 라고 나타내는
설명이다. 이부분은 조금더 개선되어야 될 여지가 있다.
딱 정해져 있는것같은데 플레이어가 해당 방에 있으면 그것까지 보여줘야 될것 같은데
아직 테스트를 안해봐서 해봐야것다.
위의 예제는 동쪽 출구를 봐 했을때 "아주 낡은 그런팅 뚱보 .."를 보여주는것이지
키워드 목록은 해당 문이 정의 될수 있는 문일경우 문의 이름을 말한다.
xx문 이렇게 정해주는것이지
특수한 경우의 출구이므로 이것에 따른 플래그값들이 생성되기 마련이다.
<문에 대한 플래그>
0 하고 1만 올수 있다.
0은 열어 명령과 닫아 명령으로는 열리지 않는 특수한 도어다. 비밀문이나 함정문 또는 일반적인
명령으로는 여 닫을수 없는 특별한 절차나 목적물이 필요한 방이다.
1 은 열고 닫고 잠그고 하는 일반적인 문이다.
2 딸수 있는 문: 만일 잠겼다면, 열쇠로 열수 있는 문이다.
초기 값으로는 모든 문이 열려있다. 그러나 열리고, 닫히고 잠기는것은 지역이 리셋될때 자동적으로
수행될수 있다. (해당 지역별로 자세한 문서들이 필요하다). 결국은 머 다 틀리다는 것이지.
<키 번호>
문에대해 가상번호를 가진 키 로 잠그고 여는 것을 수행한다. 이 키 값이 -1 인경우
열쇠 구멍이 없는 것을 의미한다. 즉 열쇠로는 이 문을 못연다는것이다. 이것이 0이라면 이문에 열수
있다는것인데 키넘버는 무시해라
<연결된 방번호>
가상의 출구의 방번호를 연결한다. 만일 값이 -1인 출구없음인경우 나갈곳이 없게 된다.
출구 명령을 써서 볼수 있다.만일 해당 방향의 출구를 더하지 않고 직접 방향 봐 명령을 써서
볼수있는 도움이 될것이다.
<방의 보조묘사>
일반적인 묘사를 적어놓는다
형식은 간단하다.
E
< 주제>~
묘사
~
예를 들어 아래와 같이 쓸경우가 있다.
~
30 148 0
E
안내문~
&y-==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==-&w
&b<<&w 미드가드 의원 이용법&b >>&w
&g 1. 체 력 회복 &w: 최대 체 력을 회복합니다.
&g 2. 마법력 회복 &w: 최대 마법력을 회복합니다.
&g 3. 이동력 회복 &w: 최대 이동력을 회복합니다.
&w 모든 부분의 치료비는 1당 100원입니다.&w
&y-==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==-&w
~
S
$~
-----------------------------------------------------------------------------------------------
<맙 파일> 에 대한 분석
#<임의의 번호>
<주제>~
<작은 묘사>~
<긴묘사>
~
<자세한 묘사>
~
<행동 bitvector> <성향 bitvector> <alignment> <type flag>
{type-정의된 정보; 상세 정보는 아래 참조}
예제>
#0
도적~
도적~
도적이 당신을 노려보고 있습니다.
~
특별한점을 찾아볼수 없습니다.
암것도 엄서 --;
~
136314888 0 -250 E
100 -5 0 4d6+2534 3d8+28
29400 10200
8 8 1
BareHandAttack: 1
E
#1
박물 관장~
박물관장~
박물관의 관장이 박물관 내부를 이곳저곳 둘러 보고 있습니다.
~
나이가 지긋한 동네 옆집 아저씨 같은 인상이 풍깁니다.
~
33554441 0 -300 E
300 -80 20 3d20+8385 3d8+100
116100 30200
8 8 1
BareHandAttack: 13
Str: 9
Dex: 8
Int: 6
Wis: 4
Con: 10
Cha: 3
Att1: 100
Att2: 100
Att3: 100
E
<임의의 번호> 는 맙의 번호이다.
<주제> 는 정의된 주제
<작은 묘사>는 간단히 설명된 문장인데 절대로 마침표로 끝나면 안된다.
<긴설명>은 길게 설명하는데 적합한 마침표로 끝나야된다.
<자세한 묘사>는 맙이름 봐 를 했을때 나오는 설명이다.
<행동 비트>
1 a SPEC This flag must be set on mobiles which have
special procedures written in C. In addition to
setting this bit, the specproc must be assigned in
spec_assign.c, and the specproc itself must (of
course) must be written. See the section on
Special Procedures in the file coding.doc for
more information.
2 b SENTINEL 이비트가 세팅되면 맙은 주변을 배회하게 된다.
4 c SCAVENGER 땅에 떨어진 값비싼것들을 줍는다.더 비싼것들을 먼저 줍는다.
8 d ISNPC 예비용
16 e AWARE Set for mobs which cannot be backstabbed.
Replaces the ACT_NICE_THIEF bit from Diku Gamma.
32 f AGGRESSIVE 공격적인 성향.
64 g STAY_ZONE 자신의 구역 밖으로 안나간다.
128 h WIMPY 협공 모드 로 20%의 데미지를 더 가할수 있다.
256 i AGGR_EVIL 악한성향의 플레이어에게 공격을 한다.
512 j AGGR_GOOD 선한성향의 플레이어에게 공격을 한다.
1024 k AGGR_NEUTRAL 중립성향의 플레이어에게 공격을 한다.
2048 l MEMORY 자신을 쳤던 유저를 기억했다가 나타나면 공격한다.
4096 m HELPER 협공
8192 n NOCHARM 저주될수 없음
16384 o NOSUMMON 소환될수 없음
32768 p NOSLEEP 잠주문을 걸수 없음
65536 q NOBASH 큰 나무처럼 팅겨 나갈수 없음 . 강타 안됨.
131072 r NOBLIND 장님 기술 안먹음.
<성향 비트>
1 a BLIND 장님임
2 b INVISIBLE 안보임
4 c DETECT_ALIGN 정렬에 민감함
8 d DETECT_INVIS 안보이는 유저와 물건을 볼수 있음
16 e DETECT_MAGIC 마법존재에 민감
32 f SENSE_LIFE 숨겨진 생명을 감지
64 g WATERWALK 수영불가능한 지역을 횡단가능
128 h SANCTUARY 성역으로부터 보호됨(절반의 데미지)
256 i GROUP 예비용.
512 j CURSE 저주받음.
1024 k INFRAVISION 어두운곳 볼수 있음.
2048 l POISON 예비용..
4096 m PROTECT_EVIL 악한 캐릭터로부터 보호됨.
8192 n PROTECT_GOOD 선한 캐릭터로부터 보호됨.
16384 o SLEEP 예비용.
32768 p NOTRACK 쫓기지 않음.
65536 q UNUSED16 사용안함 (미래에 방 세팅).
131072 r UNUSED17 사용안함 (미래에 방 세팅).
262144 s SNEAK 은신 모드로 이동 (방안에 알려지지 않음).
524288 t HIDE 은신 (오직 명안 기술로만 보임).
1048576 u UNUSED20 사용안됨 (미래 확장을 위한 방).
2097152 v CHARM 내부사용을 위해 남겨짐. 세팅 안됨.
<alignment>
맙의 성향은 -1000 부터 1000 까지 이다.
-1000 ~ -350 까지는 악함
-349~349 중립
350 ~ 1000 선함
<type flag>
표준 써클머드 3.0은 2가지 타입을 제시한다.
S - 간단하게 와 E - 확장된 이다.
C 도있는데 이건 오리지날 디쿠머드에서 쓰였다. 써클에서는 더이상 C (컴플렉스)를
쓰지 않는다.
만일 당신이 혼자서 쓸 타입이 있다면 하나 만드는것도 좋을것 같다.
-----<S 타입 몹>
아래 정의된 형식에 따른다.
______________________________________________________________________
<level> <thac0> <armor class> <max hit points> <bare hand damage>
<gold> <experience points>
<load position> <default position> <sex>
______________________________________________________________________
level - 1~ 30 까지의 몹이 있다.
thac0 - 갑옷클래스 0: 관통력을 말한다. 갑옷 강도 0을 기중으로 타격치와 마법을
사용했을경우의 타격치의 범위인데 0 에서 20까지이다.
armor class - 갑옷 강도인데 낮을수록 강하다.
AC 10 홀라당 벗은 상태
AC 0 중무장 갑옷(풀 플래이트 메일)
AC -10 전투 탱크 갑옷 ( 플레이어가 공격하기 불가능할정도)
THAC0 과 AC : 공격자가 희생자를 칠때 공격자의 THAC0 과 희생자의 AC 가 타격치를 결정한다.
공격자의 THAC0 이 낮고 희생자의 AC가 높을경우 공격자가 유리하다.
공격자의 THAC0 이 높고 희생자의 AC 가 낮을경우 희생자가 유리하다.
MAX HIT POINTS : 몹이 가할수 있는 최대 타격치이다. 형식은 " xdy+z " 를 지켜야되는다.
예를들면 4d6+10 일경우 가 의미하는것은 4번굴린 6면을 가진 주사위의 값에
10을 더한결과가 최고타격치를 결정한다. 각각 개별적으로 죽어서 다시나오거나
리셋등으로 생길때 최고타격치를 다르게 가지고 나온다. d 는 dice 주사의 약자다.
0d0+100 의 의미는 0번굴린 0면채 +100 이므로 100만 나온다. 라고 되어있는데
뭔소린지 모르것다. 단 확실한것은 4+10 인 14 부터 6+10 16 까지의 데미지가
정해지는것이 확실하다.
Bare Hand Damage (BHD)
맨손 타격치를 나타낸다. 완전 무장해제를 했을경우의 타격치이다.
xdy+z 공식에 의거하고 예를 들면 1d4+10 인경우 최저 11 에서 최고 14 의 타격치를
보인다.
gold 태어날때부터 가지고 나오는 돈
experience " 경험치
load position 태어날때부터 있는 상태 . 아래
0 POSITION_DEAD 사용안함
1 POSITION_MORTALLYW 사용안함
2 POSITION_INCAP 사용안함
3 POSITION_STUNNED 사용안함
4 POSITION_SLEEPING 자고있음
5 POSITION_RESTING 휴식중.
6 POSITION_SITTING 앉아 있음.
7 POSITION_FIGHTING 사용안함.
8 POSITION_STANDING 서있음.
Default Position - 싸우고 돌아왔을때 다시 있어야될 상태이다. 긴설명에 나타난다.
sex - 0:중성 1: 남자 2: 여자
< E 타입일경우>
S 타입을 더 확장한것으로 S 타입의 끝에 더해지는것들이 잇다. 성별 다음에 한줄이
추가된다. : 값인데 예제를 본다.
예제=============
#36
천사 지혀니~
&C천사 &W지혀니&w~
천사가 된 지혀니가 악마를 잡으려고 날아다닙니다.
~
특별한점을 찾아볼수 없습니다.
~
524554 33554498 100 E <----이부분부터
303 -80 20 30d100+210000000 100d100+100
21021321 190000000
8 8 2
BareHandAttack: 7
Str: 18
StrAdd: 18
Dex: 18
Int: 18
Wis: 18
Con: 18
Cha: 18
Att1: 10
Att2: 10
Att3: 10 <--------------이부분까지 추가
E
형식
______________________________________________________________________
<level> <thac0> <armor class> <max hit points> <bare hand damage>
<gold> <experience points>
<load position> <default position> <sex>
{E-spec list}
E
______________________________________________________________________
예제에서는 11 가지의 능력치가 더해져 있다.
BareHandAttack(맨손공격)
0 hit/hits
1 sting/stings
2 whip/whips
3 slash/slashes
4 bite/bites
5 bludgeon/bludgeons
6 crush/crushes
7 pound/pounds
8 claw/claws
9 maul/mauls
10 thrash/thrashes
11 pierce/pierces
12 blast/blasts
13 punch/punches
14 stab/stabs
싸우면서 나오는 메세지를 나타낸다.
해당 번호에 나오는 메시지는 lib/misc/messages 에 정의되어있다.
힘,덱스 등등은 3 에서 18 사이여야만 한다.
======================================================
아이템 파일
=========================================================
형식
______________________________________________________________________
#<virtual number>
<alias list>~
<short description>~
<long description>~
<action description>~
<type flag> <extra (effects) bitvector> <wear bitvector>
<value 0> <value 1> <value 2> <value 3>
<weight> <cost> <rent per day>
{Zero or more Extra Descriptions and/or Affect Fields}
______________________________________________________________________
#3610
왕관 흑 여왕~
흑여왕의 왕관~
아름답게 반짝이는 흑여왕의 왕관이 땅에 떨어져 있습니다.~
~
9 578 17
2 0 0 0
4 3000 5
A
3 1
A
4 1
두번째것은 주제 세번째는 간략설명 네번째는 상세 설명 다섯번째는 액션 설명(잘 안쓴다)
<type flag>
___________________________________________________________________
1 LIGHT 광채나는.
2 SCROLL 마법 스크롤.
3 WAND 마법 원드.
4 STAFF 마법 지팡이.
5 WEAPON 무기.
6 FIREWEAPON Currently not implemented. Do not use.
7 MISSILE Currently not implemented. Do not use.
8 TREASURE 금화보다 값진 보물(e.g. gems)
9 ARMOR 갑옷.
10 POTION 마법 물건.
11 WORN Currently not implemented. Do not use.
12 OTHER 특별한 특성없는 갖가지 물건.
13 TRASH 가게 주인이 사지 않은 청소부가 폐품으로서 버린 쓰레기.
14 TRAP Currently not implemented. Do not use.
15 CONTAINER 그릇.
16 NOTE 노트 (글을 쓸수 있다).
17 DRINKCON 호리병.
18 KEY 열쇠.
19 FOOD 음식.
20 MONEY 돈 (금화).
21 PEN 펜.
22 BOAT 배; allows you to traverse SECT_WATER_NOSWIM.
23 FOUNTAIN 분수.
___________________________________________________________________
Extra (Effects) Bitvector 보조 효과
___________________________________________________________________
1 a GLOW 이글이글 (형용사).
2 b HUM 윙윙거리는 (형용사).
4 c NORENT 빌릴수 없는.
8 d NODONATE 기부 금지.
16 e NOINVIS 투명으로 만들수 없음.
32 f INVISIBLE 투명임.
64 g MAGIC 마법기를 가지고 있고 요술이 안걸림.
128 h NODROP 저주되어있고 버려지지 않음.
256 i BLESS 축복받은 (형용사).
512 j ANTI_GOOD 선한 성향의 캐릭터는 사용불가.
1024 k ANTI_EVIL 악한 성향의 캐릭터는 사용불가.
2048 l ANTI_NEUTRAL 중립 성향의 캐릭터는 사용불가.
4096 m ANTI_MAGIC_USER 마법계열 사용불가.
8192 n ANTI_CLERIC 성직계열 사용불가.
16384 o ANTI_THIEF 도적계열 사용불가.
32768 p ANTI_WARRIOR 무사계열 사용불가.
65536 q NOSELL 상인에게 판매 구입 불가.
___________________________________________________________________
Wear Bitvector
___________________________________________________________________
1 a WEAR_TAKE 주울수 없음 (picked up off the ground).
2 b WEAR_FINGER 손가락에 착용 불가.
4 c WEAR_NECK 목에 착용 불가.
8 d WEAR_BODY 몸에 착용 불가.
16 e WEAR_HEAD 머리에 착용 불가.
32 f WEAR_LEGS 다리에 착용 불가.
64 g WEAR_FEET 발에 착용 불가.
128 h WEAR_HANDS 손에 착용 불가.
256 i WEAR_ARMS 팔에 착용 불가.
512 j WEAR_SHIELD 방패에 사용 불가.
1024 k WEAR_ABOUT 몸에서 닳음.
2048 l WEAR_WAIST 허리에서 닳음.
4096 m WEAR_WRIST 손목에서 닳음.
8192 n WEAR_WIELD 휘두를수 있음; e.g. weapons.
16384 o WEAR_HOLD 유지할수 있음 (the ``hold'' command).
___________________________________________________________________
Value 0, Value 1, Value 2, Value 3
- 이값은 매우 중요하다. 타입 플래그 기반으로 사용할수 있다.
LIGHT (Type Flag 1)
value 0: unused
value 1: unused
value 2: 일정시간동안 빛을 줌.
0: 타버리고 만다.
-1: 영원히 빛을 냄.
value 3: unused
SCROLL (Type Flag 2)
value 0: 스크롤의 주문을 외움.
value 1: Spell number 1
value 2: Spell number 2
value 3: Spell number 3
만일 3개미만의 주문서라면 -1을 세팅한다..
WAND (Type Flag 3)
value 0: 원드 주문을 외움.
value 1: 요술지팡이 충전 (>= 1)
value 2: 현재 남아있는 충전치
value 3: 주문 번호
STAFF (Type Flag 4)
value 0: 레벨에 따른 마법지팡이 주문.
value 1: 마법지팡이 충전 (>= 1)
value 2: 현재 남은 충전치
value 3: 주문 번호
WEAPON (Type Flag 5)
value 0: unused
value 1: 불규칙적인 데미지
value 2: 데미지의 크기
value 3: 타격할때의 메시지 , 이중 하나:
0 hit/hits
1 sting/stings
2 whip/whips
3 slash/slashes
4 bite/bites
5 bludgeon/bludgeons
6 crush/crushes
7 pound/pounds
8 claw/claws
9 maul/mauls
10 thrash/thrashes
11 pierce/pierces
12 blast/blasts
13 punch/punches
14 stab/stabs
FIREWEAPON (Type Flag 6)
충전안됨 (do not use)
MISSILE (Type Flag 7)
충전안됨 (do not use)
TREASURE (Type Flag 8) 재산
value 0: unused
value 1: unused
value 2: unused
value 3: unused
ARMOR (Type Flag 9)
value 0: 갑강의 수행 . 아머의 상태에 따라서 갑강이 달라진다
. 값이 >0 일경우 기능이 확장되고 ;
values <0 일경우 역기능이 된다 (저주 갑옷).
value 1: unused
value 2: unused
value 3: unused
POTION (Type Flag 10)
value 0: 레벨에 따른 포션 주문.
value 1: Spell number 1
value 2: Spell number 2
value 3: Spell number 3
3보다 작으면 -1을 세팅해서 사용안함으로 한다.
WORN (Type Flag 11)
unimplemented (do not use)
OTHER (Type Flag 12)
value 0: unused
value 1: unused
value 2: unused
value 3: unused
TRASH (Type Flag 13)
value 0: unused
value 1: unused
value 2: unused
value 3: unused
TRAP (Type Flag 14)
unimplemented (do not use)
CONTAINER (Type Flag 15) 그릇
value 0: 용기의 수용력 (최고 수용무게 )
value 1: 용기 플래그 (반드시 숫자 비트벡터)
1 CLOSEABLE 용기가 막히거나 닫힘.
2 PICKPROOF 집을수 없도록 잠김.
4 CLOSED 생성될때부터 막힘.
8 LOCKED 생성될때부터 잠김.
value 2: 이 병을 열기위한 열쇠번호.
-1 키가 필요없으면 .
value 3: Reserved for internal use -- always set as 0.
NOTE (Type Flag 16)
value 0: 언어를 쓸수 있다 (도구가 아님 ).
value 1: unused
value 2: unused
value 3: unused
DRINKCON (Type Flag 17) 호리병
See Appendix ``Item Values for Drink Containers''.
KEY (Type Flag 18)
value 0: unused
value 1: unused
value 2: unused
value 3: unused
FOOD (Type Flag 19) 음식
value 0: 이음식을 배불리 먹기위한 시간.
value 1: unused
value 2: unused
value 3: Non-zero 음식이 독일경우 , 0 다른경우 .
MONEY (Type Flag 20)
value 0: 쌓인 동전의 수 .
value 1: unused
value 2: unused
value 3: unused
PEN (Type Flag 21)
value 0: unused
value 1: unused
value 2: unused
value 3: unused
BOAT (Type Flag 22)
value 0: unused
value 1: unused
value 2: unused
value 3: unused
FOUNTAIN (Type Flag 23) 분수
See Appendix ``Item Values for Drink Containers''.
Weight
- 아이템의 무게 . 들수 있는 무게는 힘에 의해 좌우된다.
Cost
- 값어치
Rent Per Day
- 빌리는 값
<Object Extra Descriptions>
______________________________________________________________________
E
<keyword list>~ <------주제
<description text> <------설명
~
______________________________________________________________________
아이템 보조 설명이다.
<Object Affect Fields>
- 이것은 지역에 마법 속성의 영향을 미친다. 아이템의수명이 닳는동안 캐릭터에 영향을
미친다. 집을수 없다.
______________________________________________________________________
A
<location> <value>
______________________________________________________________________
Location
___________________________________________________________________
0 NONE 효과없음 (typically not used).
1 STR 힘을줌 .
2 DEX Apply to dexterity.
3 INT Apply to intelligence.
4 WIS Apply to wisdom.
5 CON Apply to constitution.
6 CHA Apply to charisma.
7 CLASS Unimplemented. Do not use.
8 LEVEL Unimplemented. Do not use.
9 AGE 머드 나이를 줌 , in MUD-years.
10 CHAR_WEIGHT 무게에 관해 수행 .
11 CHAR_HEIGHT Apply to height.
12 MANA Apply to MAX mana points.
13 HIT Apply to MAX hit points.
14 MOVE Apply to MAX movement points.
15 GOLD Unimplemented. Do not use.
16 EXP Unimplemented. Do not use.
17 AC Apply to armor class (AC).
18 HITROLL Apply to hitroll.
19 DAMROLL Apply to damage roll bonus.
20 SAVING_PARA Apply to save throw: paralyze
21 SAVING_ROD Apply to save throw: rods
22 SAVING_PETRI Apply to save throw: petrif
23 SAVING_BREATH Apply to save throw: breath
24 SAVING_SPELL Apply to save throw: spells
___________________________________________________________________
Value
- 번호를 사용해서 위치를 수정
예제 )
A
12 50
50 의 최고 마나를 더 올려줌
==================================================================
존파일
================================================================
______________________________________________________________________
#<virtual number>
<zone name>~
<top room number> <lifespan> <reset mode>
{zero or more zone commands}
S
______________________________________________________________________
<Top Room Number>
이 방번호로 오기위한 상위 방번호
<lifespan> 방의 실제 리젠 시간 분으로 나타낸다.
<reset mode> - 3가지 값을 가진다 .. 0 ,1 ,2
0 - 결코 리젠 되지 않는다. 라이프스팬의 영향을 안받는다.
1 - 리젠 조건은 리젠타임이 되었고 존이 싹쓰리되었을때이다.
매 분마다 이것을 체크한다. 이렇게하는 이유는 엄청 어려운 맙이 있을때
계속나오면 어렵기 때문이다. 결국 이 몹을 잡아야 다시 리젠된다. 겹치기
금지라는 것이지. 조건이 충족되더라도 1분동안의 시간 안에는 몹이 리젠
안된다. 그동안 토끼면 된다.
2 - 무조건 리젠 타임되면 나온다.
<Zone Commands>
M: 맙을 로드한다.
형식: M <if-flag> <mob vnum> <max existing> <room vnum>
Mob vnum 번호의 몹을 로드한다.
O: 아이템을 로드한다.
형식: O <if-flag> <obj vnum> <max existing> <room vnum>
G: 몹에게 아이템을 준다.
Format: G <if-flag> <obj vnum> <max existing>
M 명령다음에 아이템을 줘야것지
이명령을 없는 맙에게 주면 에러난다.
E: 맙이 아이템 장착
Format: E <if-flag> <obj vnum> <max existing> <equipment
position>
마찬가지로 M 명령 다음에 나와야것지.
<equipment position>
0 오른쪽에 사용
1 오른 손가락에 착용
2 왼쪽에 착용
3 목주위에 첮번째 아이템 착용
4 목주위에 두번째 아이템 착용
5 몸에 장착
6 머리에 장착
7 다리에 장착
8 발에 장착
9 손에 장착
10 팔에 장착
11 방패에 장착
12 몸에 장착
13 허리에 장착
14 오른손목에 착용
15 왼손목에 착용
16 무기로 휘두룸
17 잡는
이것도 없는 맙에게 적용하면 에러난다.
P: 아이템 안에 아이템 넣기
Format: P <if-flag> <obj vnum 1> <max existing> <obj vnum 2>
vnum2 에 vnum1 을 넣는다.
이것도 없는 맙에게 적용하면 에러난다.
D: 문에 상태를 세팅한다.
Format: D <if-flag> <room vnum> <exit num> <state>
exit num 은
0 북
1 동
2 남
3 서
4 위
5 아래
State :
0 열림
1 닫혔음
2 닫히고 잠겼음
문의 양쪽을 정확하게 하기위해 주의해야한다. 북쪽출구로 나간다음 닫은것은 자동으로 반대편
문의 남쪽출구를 닫지 않는다.
R: 방에서 아이템을 제거
Format: R <if-flag> <room vnum> <obj vnum>
room vnum 방에 obj vnum 의 아이템이 있다면 제거한다.
예제)
#30 * 존넘버 30
Northern Midgaard Main City~ * 이 존의 이름
3099 15 2 * 상위 방 번호 #3099; 리젠시간 15분
* * 사람에 관계없이 리셋
*
* Mobile
M 0 3010 1 3062 * 우체국장을 3062 방으로 배치
* Shopkeepers
M 0 3003 1 3011 Load the Weaponsmith into room 3011
* Now, give the weaponsmith items (to be placed in his inventory)
* max 100 of each of these objects can exist at a time in the world
G 1 3020 100 Dagger
G 1 3021 100 Small Sword
G 1 3022 100 Long Sword
G 1 3023 100 Wooden Club
G 1 3024 100 Warhammer
G 1 3025 100 Flail
* and lastly, give him a long sword to wield
E 1 3022 100 16 Long Sword
* Load Boards
O 0 3099 2 3000 Mortal Bulletin Board in room 3000
O 1 3096 5 3003 Social Bulletin Board in room 3003
O 1 3096 5 3018 Social Bulletin Board in room 3018
O 1 3096 5 3022 Social Bulletin Board in room 3022
O 1 3096 5 3028 Social Bulletin Board in room 3028
* "S" must appear after all commands for a particular zone
S
=============================================
상점
===============================================
______________________________________________________________________
CircleMUD v3.0 Shop File~
<Shop 1>
<Shop 2>
<Shop n>
$~
______________________________________________________________________
CircleMUD v3.0 Shop File~
#1805~ <-----상점번호
1801 <----아이템 번호
-1 <- 무조건 -1
1.00 <---- 부동 소수점으로 나타내는데 100% 제가격으로 팔거나 더 비쌈 1.00 보다 더 크던지 같을것이다.
1.00 <----살때니깐 반대이것지. 1.00 보다 더 작게 살거야
<Buy Type 3> [Buy Namelist 1] <----------5 는 무기, 9 는 갑옷 등등
-1 <----무조건 -1
%s 죄송합니다. 그런 물건은 없습니다.~ <------더이상 살 물건이 없을경우
%s 그런 물건은 없군요.~ <-------더이상 팔 물건이 없을경우
%s 그런건 않삽니다.~ <----물건 구매 거부
%s 죄송합니다. 돈이 없어서 못삽니다.~ <-----상점에 돈이 모자랄경우
%s 돈도 없으면서...~ <-----플레이어가 돈이 없을경우
%s 감사합니다. %d 골드 입니다.~ <---성공적으로 구매
%s 감사합니다. %d 골드를 드리겠습니다.~ <--성공적으로 판매
0 <--- -1일경우 아무런 메시지없음, 0 일경우 유져에게 구토 ,1 인경우 담배물기
0 <--- 1 : 유져가 상점주인 공격가능 2: 주인이 15000원이상 저축가능 참고)주인죽이면 불특정한 아이템을 준다.
1811 <---- 상점지킴이 맙 번호
0 <--- 1:긍정적 성향의 플레이어와 거래안함,2:악한성향 거래안함,4:중립성향 거래안함,8:마법사와 거래안함,16:성직자,32:도적,64:무사
1805 <---- 상점 번호 나열
-1 <----무조건 -1
0 <----오픈 머드 시간
28 <--패점 머드 시간. 0 28 0 0 은 항상 열려 있다.
0
0
주문 번호
______________________________________________________________________
animate dead 45
armor 1
bless 3
blindness 4
burning hands 5
call lightning 6
charm 7
chill touch 8
clone 9
color spray 10
control weather 11
create food 12
create water 13
cure blind 14
cure critic 15
cure light 16
curse 17
detect align 18
detect invis 19
detect magic 20
detect poison 21
dispel evil 22
dispel good 46
earthquake 23
enchant weapon 24
energy drain 25
fireball 26
group armor 47
group heal 48
group recall 49
harm 27
heal 28
identify 201
infravision 50
invisible 29
lightning bolt 30
locate object 31
magic missile 32
poison 33
prot from evil 34
remove curse 35
remove poison 43
sanctuary 36
sense life 44
shocking grasp 37
sleep 38
strength 39
summon 40
teleport 2
ventriloquate 41
waterwalk 51
word of recall 42
______________________________________________________________________
마실거 속성
______________________________________________________________________
Type nr. Effect of Liquid On:
Drunkness Fullness Thirst
LIQ_WATER 0 0 1 10
LIQ_BEER 1 3 2 5
LIQ_WINE 2 5 2 5
LIQ_ALE 3 2 2 5
LIQ_DARKALE 4 1 2 5
LIQ_WHISKY 5 6 1 4
LIQ_LEMONADE 6 0 1 8
LIQ_FIREBRT 7 10 0 0
LIQ_LOCALSPC 8 3 3 3
LIQ_SLIME 9 0 4 -8
LIQ_MILK 10 0 3 6
LIQ_TEA 11 0 1 6
LIQ_COFFE 12 0 1 6
LIQ_BLOOD 13 0 2 -1
LIQ_SALTWATER 14 0 1 -2
LIQ_CLEARWATER 15 0 0 13
______________________________________________________________________
=========================================
명령어 처리 분석
=================================
interpreter.c 에서 명령어에 대한 정의가 있다.
여기서 명령어 정의 할때 예를 들어 do_action 문장이 포함되면 해당 명령어는
{ "도움" , POS_DEAD , do_help , 0, 0 },
이런식으로 정의 되는데 도움명령어에 대한것을 정의하며 do_help 라는 함수에
비트값을 0,0 으로 세팅한다.
모두 이런식으로 정의하며 해당 함수들은 act.xxxxx.c 파일에 나뉘어 저장된다.
통신에 관계된 함수들을 모아놓은 파일은 comm.c 에 들어있다.
이곳에는 접속에 관계된것과 통신에 관계된 함수를 처리한다.
utils.c 에는 잡동사니 기술같은것들의 함수들이 있다. 글처리같은..
맨처음 시작화면 lib\text\greetings
class.c
/* The menu for choosing a class in interpreter.c: */
const char *class_menu =
"\r\n"
"Select a class:\r\n"
" [C]leric\r\n"
" [T]hief\r\n"
" [W]arrior\r\n"
" [M]agic-user\r\n";
/*
* The code to interpret a class letter -- used in interpreter.c when a
* new character is selecting a class and by 'set class' in act.wizard.c.
*/
int parse_class(char arg)
{
arg = LOWER(arg);
switch (arg) {
case 'm': return CLASS_MAGIC_USER;
case 'c': return CLASS_CLERIC;
case 'w': return CLASS_WARRIOR;
case 't': return CLASS_THIEF;
default: return CLASS_UNDEFINED;
}
}
를 수정하고
interpreter.c 에서 함수 선언을 해준다.
int parse_hair(char *arg);
int parse_eye(char *arg);
NUM_CLASSES(직업 가지수)상수 는 structs.h 에 7로 정의 되어있슴.
config.c----------------------------------------------------------------
ush_int DFLT_PORT = 5001; 포트번호
아직 미완성..... 게을러서 --