머드클럽
머드게임이란?
게임은 어떤 환경에서?
본격적으로 게임해 볼까?
배너교환
머드강좌
일반 머드강좌
성천사님의 머드강좌
혼님의 머드강좌
방울꽃님의 머드강좌
리트님의 머드강좌
2Soo님의 머드강좌
내머드소개하기
접속가능머드
내머드소개하기
자료실
접속 프로그램
머드소스
머드 유틸리티
기타
커뮤니티
공지사항
등업신청
머드클럽에바란다
자유 게시판
질문 AND 답변
머드클럽 갤러리
구인구직
머드게임소개
사신전(死神戰)
사신전 소개
사신전 맵
사신전 명령어 모음집
천명(天命)
천명 소개
천명 맵
천명 명령어 모음집
마이페이지
로그인
회원가입
계정찾기
로그인
회원가입
계정찾기
텍스트머드클럽
검색
[circle]임무 소스 수정좀 도와주세요
유니콘
1
2,879
0
0
2009-05-04 01:51:07
안녕하세요 <br />재가 머드를 하나 운영하고 있는데요 <br />소스에 관해 질문을 하려고 합니다. <br />재 머드에 임무가 있는데요 <br />그 임무 소스에 혹시 문제가 있는지 좀 알려주세요 <br />아직 까지는 문제가 있는지는 전 모르겠는데요 <br />어떤 사람이 있다고 한거 같아서 한번 확인하려고요 <br />문제 있는 부분을 댓글로 좀 달아주세요 <br />수정 방법도 올려주시면 감사하겠고요 <br />그럼 수고하세요 <br /> <br /> <br />/* ************************************************************************* <br />* File: quest.c Part of CircleMUD * <br />* Purpose: To provide special quest-related code. * <br />* * <br />* Morgaelin - quest.c * <br />* Copyright (C) 1997 MS * <br />************************************************************************* */ <br /> <br />#include "conf.h" <br />#include "sysdep.h" <br /> <br />#include "structs.h" <br />#include "utils.h" <br />#include "interpreter.h" <br />#include "db.h" <br />#include "comm.h" <br />#include "screen.h" <br />#include "olc.h" <br />#include "quest.h" <br /> <br />struct aq_data *aquest_table; <br />extern struct index_data *mob_index; <br />extern int top_of_aquestt; <br />extern struct index_data *obj_index; <br />extern struct room_data *world; <br />extern long asciiflag_conv(char *flag); <br /> <br />const char *quest_types[] = { <br /> "물건찾기", <br /> "방찾아가기", <br /> "맙찾기", <br /> "맙죽이기", <br /> "맙구하기", <br /> "물건전달", <br /> "\n" <br />}; <br /> <br />/* Autoquest flags */ <br />char *aq_flags[] = { <br /> "반복", <br /> "\n" <br />}; <br /> <br />int real_quest(int vnum) <br />{ <br /> int rnum; <br /> <br /> for (rnum=0; rnum <= top_of_aquestt; rnum++) <br /> { <br /> if (rnum <= top_of_aquestt) <br /> if (aquest_table[rnum].virtual==vnum) break; <br /> } <br /> <br /> if (rnum>top_of_aquestt) rnum = -1; <br /> return (rnum); <br />} <br /> <br />int is_complete(struct char_data *ch, int vnum) <br />{ <br /> int i; <br /> <br /> for (i=0; i <= ch->num_completed_quests; i++) <br /> if (ch->completed_quests[i] == vnum) <br /> return TRUE; <br /> <br /> return FALSE; <br />} <br /> <br />int find_quest_by_qmnum(int qm, int num) <br />{ <br /> int i; <br /> int found=0; <br /> <br /> for (i=0; i <= top_of_aquestt; i++) <br /> if (qm == aquest_table[i].mob_vnum) { <br /> found++; <br /> if (found == num) <br /> return (aquest_table[i].virtual); <br /> } <br /> <br /> return -1; <br />} <br /> <br />/* PARSE_QUEST */ <br />void parse_quest(FILE * quest_f, int nr) <br />{ <br /> static char line[256]; <br /> static int i = 0, j; <br /> int retval = 0, t[6]; <br /> char f1[128]; <br /> <br /> aquest_table[i].virtual = nr; <br /> aquest_table[i].mob_vnum = -1; <br /> aquest_table[i].short_desc = NULL; <br /> aquest_table[i].desc = NULL; <br /> aquest_table[i].info = NULL; <br /> aquest_table[i].ending = NULL; <br /> aquest_table[i].flags = 0; <br /> aquest_table[i].type = -1; <br /> aquest_table[i].target = -1; <br /> aquest_table[i].exp = 0; <br /> for (j=0; j < 4; j++) <br /> aquest_table[i].value[j] = 0; <br /> aquest_table[i].next_quest = -1; <br /> aquest_table[i].killmark = 0; <br /> <br /> /* begin to parse the data */ <br /> aquest_table[i].short_desc = fread_string(quest_f, buf2); <br /> aquest_table[i].desc = fread_string(quest_f, buf2); <br /> aquest_table[i].info = fread_string(quest_f, buf2); <br /> aquest_table[i].ending = fread_string(quest_f, buf2); <br /> <br /> if (!get_line(quest_f, line) || <br /> (retval = sscanf(line, " %d %d %s %d %d %d %d", t, t+1, f1, t+2, t+3, t+4, t+5)) != 7) { <br /> fprintf(stderr, "Format error in numeric line (expected 7, got %d), %s\n", retval, buf2); <br /> exit(1); <br /> } <br /> aquest_table[i].type = t[0]; <br /> aquest_table[i].mob_vnum = t[1]; <br /> aquest_table[i].flags = asciiflag_conv(f1); <br /> aquest_table[i].target = t[2]; <br /> aquest_table[i].exp = t[3]; <br /> aquest_table[i].next_quest = t[4]; <br /> aquest_table[i].killmark = t[5]; <br /> <br /> if (!get_line(quest_f, line) || <br /> (retval = sscanf(line, " %d %d %d %d", t, t+1, t+2, t+3)) != 4) <br />{ <br /> fprintf(stderr, "Format error in numeric line (expected 4, got %d), %s\n", retval, buf2); <br /> exit(1); <br /> } <br /> aquest_table[i].value[0] = t[0]; <br /> aquest_table[i].value[1] = t[1]; <br /> aquest_table[i].value[2] = t[2]; <br /> aquest_table[i].value[3] = t[3]; <br /> <br /> for (;;) { <br /> if (!get_line(quest_f, line)) { <br /> fprintf(stderr, "Format error in %s\n", buf2); <br /> exit(1); <br /> } <br /> switch(*line) { <br /> case 'S': <br /> top_of_aquestt = i++; <br /> return; <br /> break; <br /> } <br /> } <br /> <br />} /* parse_quest */ <br /> <br /> <br />void list_quests(struct char_data *ch, int questmaster) <br />{ <br /> int i; <br /> int number = 1; <br /> <br /> sprintf(buf, "&w-&y* &w팁 &y*&w- &y번호 임무정보&w (상세 정보를 볼수 있습니다.)&w\r\n[=3F-==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==-[=0F\r\n" <br /> "&5 임무정보 &0&w\r\n" <br />"&c-==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==--==*==-&w\r\n"); <br /> for (i = 0; i <= top_of_aquestt; i++) <br /> if (questmaster == aquest_table[i].mob_vnum) { <br /> sprintf(buf, "%s%3d %-60s %s\r\n", buf, number, aquest_table[i].desc, <br /> is_complete(ch, aquest_table[i].virtual) ? "(완수)" : ""); <br /> number++; <br /> strcat(buf,"&y━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&w\r\n"); <br /> <br /> } <br /> send_to_char(buf, ch); <br />} <br /> <br />void add_completed_quest(struct char_data *player, int num) <br />{ <br /> sh_int *temp; <br /> int i; <br /> <br /> CREATE(temp, sh_int, player->num_completed_quests +1); <br /> for (i=0; i <= player->num_completed_quests; i++) <br /> temp[i] = player->completed_quests[i]; <br /> <br /> player->num_completed_quests++; <br /> temp[player->num_completed_quests] = num; <br /> <br /> if (player->completed_quests) <br /> free(player->completed_quests); <br /> player->completed_quests = temp; <br />} <br /> <br />/* Generic reward character, cleanup stuff fn */ <br />void generic_complete_quest(struct char_data *ch) <br />{ <br /> int rnum; <br /> <br /> rnum = real_quest(GET_QUEST(ch)); <br /> <br /> GET_EXP(ch) += aquest_table[rnum].exp; <br /> GET_KILLMARK(ch) += aquest_table[rnum].killmark; <br /> send_to_char(aquest_table[rnum].ending, ch); <br /> sprintf(buf, "&w[&mMISSON&w] &m%s님이 임무를 완수하여 &g%d&m의 평 가를 획득하였습니다.&w&w\r\n", <br /> GET_NAME(ch), aquest_table[rnum].killmark); <br /> send_to_except(buf, ch); <br /> REMOVE_BIT(PRF_FLAGS(ch), PRF_QUEST); <br /> if (!IS_SET(aquest_table[rnum].flags, AQ_REPEATABLE)) <br /> add_completed_quest(ch, GET_QUEST(ch)); <br /> if ((real_quest(aquest_table[rnum].next_quest) >= 0) && <br /> (aquest_table[rnum].next_quest != GET_QUEST(ch)) && <br /> !is_complete(ch, aquest_table[rnum].next_quest)) { <br /> GET_QUEST(ch) = aquest_table[real_quest((int)GET_QUEST(ch))].next_quest; <br /> send_to_char(aquest_table[real_quest((int)GET_QUEST(ch))].info, ch); <br /> } else <br /> GET_QUEST(ch) = -1; <br /> <br /> save_char(ch, ch->in_room); <br />} <br /> <br />void autoquest_trigger_check(struct char_data *ch, struct char_data *vict, <br /> struct obj_data *object, int type) <br />{ <br /> struct char_data *i; <br /> int rnum, found; <br /> <br /> if (IS_NPC(ch)) <br /> return; <br /> <br /> if (GET_QUEST(ch) < 0) /* No current quest, skip this */ <br /> return; <br /> <br /> if (GET_QUEST_TYPE(ch) != type) <br /> return; <br /> <br /> if ((rnum = real_quest(GET_QUEST(ch))) < 0) <br /> return; <br /> <br /> switch (type) { <br /> case AQ_OBJECT: <br /> if (aquest_table[rnum].target == GET_OBJ_VNUM(object)) <br /> generic_complete_quest(ch); <br /> break; <br /> case AQ_ROOM: <br /> if (aquest_table[rnum].target == world[ch->in_room].number) <br /> generic_complete_quest(ch); <br /> break; <br /> case AQ_MOB_FIND: <br /> for (i=world[ch->in_room].people; i; i = i->next_in_room) <br /> if (IS_NPC(i)) <br /> if (aquest_table[rnum].target == GET_MOB_VNUM(i)) <br /> generic_complete_quest(ch); <br /> break; <br /> case AQ_MOB_KILL: <br /> if (!IS_NPC(ch) && IS_NPC(vict) && (ch != vict)) <br /> if (aquest_table[rnum].target == GET_MOB_VNUM(vict)) <br /> generic_complete_quest(ch); <br /> break; <br /> case AQ_MOB_SAVE: <br /> found = TRUE; <br /> if (ch == vict) <br /> found = FALSE; <br /> <br /> for (i = world[ch->in_room].people; i && found; i = i->next_in_room) <br /> if (i && IS_NPC(i)) <br /> if ((GET_MOB_VNUM(i) != aquest_table[rnum].target) && !AFF_FLAGGED(i, AFF_CHARM)) <br /> found = FALSE; <br /> <br /> if (found) <br /> generic_complete_quest(ch); <br /> break; <br /> case AQ_RETURN_OBJ: <br /> if (IS_NPC(vict) && (GET_MOB_VNUM(vict) == aquest_table[rnum].value[0])) <br /> if (object && (GET_OBJ_VNUM(object) == aquest_table[rnum].target)) <br /> generic_complete_quest(ch); <br /> break; <br /> default: <br /> log("SYSERR: Invalid quest type passed to autoquest_trigger_check"); <br /> break; <br /> } <br />} <br /> <br />SPECIAL(questmaster) <br />{ <br /> int tmp, num; <br /> struct char_data *qm = me; <br /> <br /> if (CMD_IS("임무정보")) { <br /> if (!*argument) <br /> list_quests(ch, GET_MOB_VNUM(qm)); <br /> else { <br /> if ((num = find_quest_by_qmnum(GET_MOB_VNUM(qm), atoi(argument))) >= 0) { <br /> if (aquest_table[real_quest(num)].info) <br /> send_to_char(aquest_table[real_quest(num)].info, ch); <br /> else <br /> send_to_char("그 임무에는 더이상의 정보가 없습니다.\r\n", ch); <br /> } else <br /> send_to_char("그런 번호의 임무는 없습니다!\r\n", ch); <br /> } <br /> return 1; <br /> } <br /> <br /> if (CMD_IS("참가")) { <br /> if (!*argument) { <br /> send_to_char("무슨 임무에 참가하실려구요?\r\n",ch); <br /> return 1; <br /> } <br /> if (GET_QUEST(ch) != -1) { <br /> send_to_char("당신은 이미 임무수행중에 있습니다!\r\n",ch); <br /> return 1; <br /> } <br /> <br /> tmp = atoi(argument); <br /> tmp = find_quest_by_qmnum(GET_MOB_VNUM(qm), tmp); <br /> if ((tmp >= 0) && !is_complete(ch, tmp)) { <br /> send_to_char("&R ▦▦&r▩▩▨&w&v 임무수행정보 &r▨▩▩&R▦▦\r\n" <br /> " ▦&r▩▩▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▩▩&R▦&w\r\n\r\n",ch); <br /> /* send_to_char("\x1B[7m[임무수행]&w&W 당신은 이제 임무를 <br />수행합니다!&w\r\n-------------------------------------------\r\n", ch);*/ <br /> /*send_to_char(aquest_table[real_quest(tmp)].info, ch);*/ <br /> sprintf(buf, "&B[&W힌트&B]&w %s\r\n", <br /> aquest_table[real_quest(tmp)].info); <br /> send_to_char(buf, ch); <br /> GET_QUEST(ch) = tmp; <br /> SET_BIT(PRF_FLAGS(ch), PRF_QUEST); <br /> return 1; <br /> } else if (is_complete(ch, tmp)) { <br /> send_to_char("당신은 그 임무를 벌써 완수했습니다!\r\n", ch); <br /> return 1; <br /> } else { <br /> send_to_char("그런 임무는 없습니다!\r\n",ch); <br /> return 1; <br /> } <br /> } <br /> <br /> return 0; <br />} <br /> <br />ACMD(do_questquit) <br />{ <br />int gold; <br /> <br />if(GET_QUEST(ch) == -1) { <br />send_to_char("당신은 임무수행중이 아닙니다.\r\n", ch); <br />return; <br />} else { <br />gold = GET_LEVEL(ch) * 5000; <br />if (GET_GOLD(ch) < gold) { <br />send_to_char("임무를 취소하려면 배상금을 치루어야 합니다.\r\n", ch); <br />return; <br />} <br />*buf = '\0'; <br />sprintf(buf, "당신은 주어진 임무를 취소하여 &G%d&w골드의 손해를 입었습니다.\r\n", gold); <br />GET_GOLD(ch) -= gold; <br />GET_QUEST(ch) = -1; <br />REMOVE_BIT(PRF_FLAGS(ch), PRF_QUEST); <br />save_char(ch, NOWHERE); <br />send_to_char(buf, ch); <br /> } <br />} <br /> <br />ACMD(do_questinfo) <br />{ <br />int num; <br /> <br /> *buf = '\0'; <br /> <br />if(GET_QUEST(ch) == -1) { <br />send_to_char("당신은 임무수행중이 아닙니다.\r\n", ch); <br />return; <br />} else { <br />sprintf(buf, " &R▦▦&r▩▩▨&w&v 수행중인 임무 &r▨▩▩&R▦▦\r\n" <br />" ▦&r▩▩▨▨▨▨▨▨▨▨▨▨▨▨▩▩&R▦&w\r\n\r\n" <br />"&B[&W임무No:&Y %d&B]&w %s", <br />aquest_table[real_quest(GET_QUEST(ch))].virtual, <br />aquest_table[real_quest(GET_QUEST(ch))].info); <br />send_to_char(buf, ch); <br /> } <br />} <br />ACMD(do_qstat) <br />{ <br /> int vnum, rnum; <br /> char str[MAX_INPUT_LENGTH]; <br /> struct char_data *tmp; <br /> <br /> half_chop(argument, str, argument); <br /> if (*str) { <br /> vnum = atoi(str); <br /> rnum = real_quest(vnum); <br /> if (rnum < 0) { <br /> send_to_char("그런 번호는 없습니다.\r\n", ch); <br /> return; <br /> } <br /> *buf = '\0'; <br /> tmp = read_mobile(aquest_table[rnum].mob_vnum, VIRTUAL); <br /> sprintbit(aquest_table[rnum].flags, aq_flags, buf2); <br /> sprintf(buf, "번호 : [%s%5d%s], 존번호: [%5d] -- 메신져: %s%s%s\r\n", <br /> CCGRN(ch, C_NRM), vnum, CCNRM(ch, C_NRM), rnum, <br /> CCYEL(ch, C_NRM), GET_NAME(tmp), CCNRM(ch, C_NRM)); <br /> sprintf(buf, "%s&m임무 : %s&w\r\n", buf, aquest_table[rnum].short_desc); <br /> sprintf(buf, "%s묘사 : %s\r\n", buf, aquest_table[rnum].desc); <br /> sprintf(buf, "%s정보 :\r\n%s%s%s", buf, CCCYN(ch, C_NRM), aquest_table[rnum].info, CCNRM(ch, C_NRM)); <br /> sprintf(buf, "%s엔딩 :\r\n%s%s%s", buf, CCCYN(ch, C_NRM), aquest_table[rnum].ending, CCNRM(ch, C_NRM)); <br /> sprintf(buf, "%s형식 : %s, 목표물: %d, 경험치: %d, 다음임무: %d\r\n", <br /> buf, quest_types[aquest_table[rnum].type], aquest_table[rnum].target, <br /> aquest_table[rnum].exp, aquest_table[rnum].next_quest); <br /> sprintf(buf, "%s평 가: %d\r\n", buf, aquest_table[rnum].killmark); <br /> sprintf(buf, "%s가 치: %d %d %d %d\r\n", buf, aquest_table[rnum].value[0], <br /> aquest_table[rnum].value[1], aquest_table[rnum].value[2], <br /> aquest_table[rnum].value[3]); <br /> sprintf(buf, "%s플래그: %s\r\n", buf, buf2); <br /> send_to_char(buf, ch); <br /> <br /> } else send_to_char("사용법: 번호 임무보기\r\n", ch); <br />} <br /> <br />ACMD(do_qlist) <br />{ <br /> <br /> int first, last, nr, found = 0; <br /> char pagebuf[65536]; <br /> <br /> strcpy(pagebuf,""); <br /> <br /> two_arguments(argument, buf, buf2); <br /> <br /> if (!*buf) { <br /> send_to_char("사용법: <시작번호> <끝번호> 임무목록\r\n", ch); <br /> return; <br /> } <br /> <br /> first = atoi(buf); <br /> if (*buf2) last = atoi(buf2); <br /> else { <br /> first *= 100; <br /> last = first+99; <br /> } <br /> <br /> if ((first < 0) || (first > 99999) || (last < 0) || (last > 99999)) { <br /> send_to_char("값은 0에서 99999까지여야 합니다.\n\r", ch); <br /> return; <br /> } <br /> <br /> if (first >= last) { <br /> send_to_char("두번째 값이 첫번째 값보다 커야 합니다.\n\r", ch); <br /> return; <br /> } <br /> <br /> for (nr = 0; nr <= top_of_aquestt && (aquest_table[nr].virtual <= last); nr++) <br /> { <br /> if (aquest_table[nr].virtual >= first) { <br /> sprintf(buf, "%5d. [%5d] %s\r\n", ++found, <br /> aquest_table[nr].virtual, <br /> aquest_table[nr].short_desc); <br /> strcat(pagebuf, buf); <br /> } <br /> } <br /> <br /> if (!found) <br /> send_to_char("설정되어 있는 임무가 없습니다.\n\r", ch); <br /> else page_string(ch->desc, pagebuf, TRUE); <br />} <br /> <br />
0
0
새글
답변
수정
삭제
최신목록
전체목록
혹시 Dale (또는 ShadowDale) 류 머드 소스나, 운영되는 곳 아시는 분?
십웅기 돌여고 하는데 에러가 나네요..
1
Comments
성천사
2009.05.18(월) 오전 02:05:35
답변
임무소스는 보통 다른 소스에도 연계되어 있기 때문에 정확히 오류를 올려주셔야 할겁니다 아마도.
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
댓글에 답하기
입력
닫기
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 955개 / 검색된 게시물: 955개
질문 답변 외 글은 자유 게시판에 올려 주세요...
[circle]
임무 소스 수정좀 도와주세요
1
2880
0
0
유니콘
2009-05-04
[기타]
십웅기 돌여고 하는데 에러가 나네요..
0
2948
0
0
정호정
2009-03-31
[기타]
헌터 쏘스 말인대요.
0
2279
0
0
임성호(2)
2009-03-26
[기타]
안녕하세요
1
2303
0
0
임성호(2)
2009-03-16
[기타]
제3 질문
0
2347
0
0
변인수
2008-08-31
[circle]
구 에프라임 재컴파일시 오류
6
2665
0
0
시험이
2009-03-03
[기타]
체력 회복 방법
1
2570
0
0
천우신
2009-02-15
[circle]
오류가 뜨는 이유좀 어케 고치는 것두요
0
6524
0
0
유니콘
2009-01-31
[기타]
나래머드나 치약머드 소스 구합니다.
2
2833
0
0
황장원
2009-01-06
[circle]
이 오루 왜 나는건가요
1
3657
0
0
유니콘
2008-12-18
[기타]
헌터 포트열고 접속하는데.. 튕기네요..
0
2128
0
0
박현종
2008-12-09
[mordor]
mordor6.66을 xp에서는 운영할수 없나요?
1
2543
0
0
김희준
2008-11-02
[기타]
머드 소스 자료실의 99hunter 에 대해서...
2
2661
0
0
Magician
2008-10-12
[mordor]
제3다시 질문
0
2305
0
0
변인수
2008-09-27
[기타]
강호무림 이야기잣말 짤줄 아시는분 좀 올려주세요..
0
2868
0
0
유태영
2008-09-05
[기타]
강호무림 주소 좀 알려주세요~
1
2451
0
0
송무근
2008-08-31
[기타]
와이틴 사용방법 좀 가르쳐주세요
2
3828
0
0
한승엽
2008-08-26
[circle]
제3을 열었는데 질문합니다
1
2506
0
0
변인수
2008-08-24
[기타]
질문이 있어요.
3
2177
0
0
아베리아
2008-08-20
[기타]
실행 관련 질문. (도와주세요 ㅠ)
4
2667
0
0
오일택
2008-07-31
이전
1
2
3
4
5
6
7
8
9
10
다음
건너뜀
검색
글쓰기
최신목록
전체목록
시작일
종료일
검색어
이름
제목
내용
검색
닫기
로그인
회원가입
계정찾기
개인정보처리방침
이용약관
PC화면
Copyright (c) 텍스트머드클럽. All rights reserved.
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
닉네임으로 입력
내용
쪽지가 도착하였습니다.
쪽지함
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--