머드클럽
머드게임이란?
게임은 어떤 환경에서?
본격적으로 게임해 볼까?
배너교환
머드강좌
일반 머드강좌
성천사님의 머드강좌
혼님의 머드강좌
방울꽃님의 머드강좌
리트님의 머드강좌
2Soo님의 머드강좌
내머드소개하기
접속가능머드
내머드소개하기
자료실
접속 프로그램
머드소스
머드 유틸리티
기타
커뮤니티
공지사항
등업신청
머드클럽에바란다
자유 게시판
질문 AND 답변
머드클럽 갤러리
구인구직
머드게임소개
사신전(死神戰)
사신전 소개
사신전 맵
사신전 명령어 모음집
천명(天命)
천명 소개
천명 맵
천명 명령어 모음집
마이페이지
로그인
회원가입
계정찾기
로그인
회원가입
계정찾기
텍스트머드클럽
검색
[circle]임무 소스 수정좀 도와주세요
유니콘
1
2,839
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
답변
임무소스는 보통 다른 소스에도 연계되어 있기 때문에 정확히 오류를 올려주셔야 할겁니다 아마도.
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
댓글에 답하기
입력
닫기
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 954개 / 검색된 게시물: 954개
질문 답변 외 글은 자유 게시판에 올려 주세요...
[기타]
에타츠 합시다
0
2438
0
0
진성욱
2010-02-05
[기타]
고전 머드게임을 찾습니다.
4
4545
0
0
『네토코』
2010-01-06
[기타]
강호2 다시 안열리나요? 열렸으면 주소 좀 알려주세요 ^^
0
2717
0
0
정진
2010-01-01
[circle]
메이크 질문
3
2695
0
0
유니콘
2009-12-27
[circle]
신세계 소스 질문
3
2825
0
0
유니콘
2009-11-15
[기타]
사르디니아 하고 싶은데요~!
0
2688
0
0
박국태
2009-11-06
[mordor]
언제부턴가 bin 폴더에...
2
2806
0
0
노병우
2009-10-27
[hanlp]
안녕하세요!! 처음 접속할떄 질문사항입니다.
2
4058
0
0
이강혁
2009-10-24
[기타]
머드에 메신저 연동 방법 아시는 분
2
2756
0
0
암로
2009-09-17
[기타]
질문이요^^;
1
2516
0
0
송태헌
2009-08-29
[기타]
천상천하 라는 게임을 하려는데요.
2
2640
0
0
김돈기
2009-08-27
[hanlp]
한엘피 엔진 메뉴얼 같은건 없나요?
10
2945
0
0
히든
2009-08-14
[hanlp]
절망의 땅
0
2575
0
0
게임중독
2009-07-27
[기타]
사신전에서 장비착용
0
3
0
0
권도엽
2009-07-18
[기타]
아 좀 도와주세요
1
2400
0
0
오창록
2009-07-01
[hanlp]
프리드러시 주소좀.. 알려줘요
0
2360
0
0
한경남
2009-06-29
[circle]
신세계 질문입니다.
3
2576
0
0
임성호(2)
2009-06-18
[hanlp]
머드 서버의 디버깅 방법 아시는분?
2
2705
0
0
우창희
2009-05-28
[기타]
혹시 Dale (또는 ShadowDale) 류 머드 소스나, 운영되는 곳 아시는 분?
1
2346
0
0
윤호재
2009-05-12
[circle]
임무 소스 수정좀 도와주세요
1
2840
0
0
유니콘
2009-05-04
이전
1
2
3
4
5
6
7
8
9
10
다음
건너뜀
검색
글쓰기
최신목록
전체목록
시작일
종료일
검색어
이름
제목
내용
검색
닫기
로그인
회원가입
계정찾기
개인정보처리방침
이용약관
PC화면
Copyright (c) 텍스트머드클럽. All rights reserved.
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
닉네임으로 입력
내용
쪽지가 도착하였습니다.
쪽지함
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--