제 머드의 기본 설정은 매 15초마다 이동 할 수 있게 comm.c:if (!(pulse % (15 * PASSES_PER_SEC))) { 안에 넣어져 있습니다.
// 아래의 내용을 limits.c 안에 삽입 후 comm.c 안 15 * PASSES_PER_SEC 안에 fifteen_second(); 를 삽입해 매 15초 마다 실행할 수 있도록 한다.
void fifteen_second(void)
{
extern struct index_data *obj_index;
extern struct obj_data *object_list;
struct char_data *i, *next_char;
struct obj_data *obj, *next_obj;
/*
사용자, 맙 등록된 모든 대상중 사용자 검색
for (i = character_list; i; i = next_char) {
next_char = i->next;
if (i->desc) { // 접속해 있는 사용자 라면
}
}
*/
for (obj = object_list; obj; obj = next_obj) { // 게임 내 존재하는(젠 되어 있는) 모든 물건을 검색
next_obj = obj->next;
moving_items(obj); // 이동하는 물건 처리
if (!next_obj)
break;
}
}
// 아래의 내용을 handler.c 안에 삽입
void moving_items(struct obj_data *obj)
{
extern const char *han_dirs[]; // 방향 한글 출력용 텍스트
int where = -1, i = 0, j = 0, found = 0, random = 0, r_num = 0, perc = 0;
char buf[MAX_INPUT_LENGTH]="";
int dirs[6] = { 0, };
int b_zone = 0, a_zone = 0;
/* 물건에 플래그를 삽입해 이 물건이 이동하는 물건임을 체크해야 하므로 본인 머드에 맞는
플래그를 삽입하면 됩니다.
if (!IS_SET(GET_OBJ_SPARE9(obj), ITEM_NEWTWO_MOVING)) (이동물건 체크용, 본인 머드에 맞는 물건 플래그중 하나를 사용합니다.)
return;
*/
/* 야생(?)의 물건이 아닐 경우 이동 하지 않도록 체크하는 부분입니다. 물건을 가졌을 때 체크
해서 해당 물건은 더 이상 이동이 불가능 하도록 설정합니다.
if (GET_OBJ_SPARE6(obj) > 0) // (이동물건 이동불가 체크용, 본인 머드에 맞는 물건 플래그중 하나를 사용합니다.)
return;
*/
if (obj->carried_by) // 소지하고 있으면 이동하지 않음
return;
if (obj->worn_by) // 장비하고 있으면 이동하지 않음
return;
if (obj->in_obj) // 보관함안에 있으면 이동하지 않음
return;
perc = number(1, 100); // 확률을 설정합니다.
if (perc <= 50) { // 이동물건이 이동할 확률(50% 확률로 이동합니다)
if (obj->in_room > NOWHERE) { // 물건이 방 안에 있으면
// 본격적인 이동물건 설정 시작 [0] 북, [1] 동, [2] 남, [3] 서, [4] 위, [5] 밑
// 현재 방에 북쪽으로 연결되어 있고, 북쪽에 이동할 방이 있고 문이 닫혀 있지 않으면 이동가능 하므로 0(북쪽)
if (world[obj->in_room].dir_option[0] && world[obj->in_room].dir_option[0]->to_room &&
!IS_SET(world[obj->in_room].dir_option[0]->exit_info, EX_CLOSED)) {
dirs[0] = 0;
} else dirs[0] = -1; // 그 외의 경우에는 갈 수 없으므로 -1
// 현재 방에 동쪽으로 연결되어 있고, 동쪽에 이동할 방이 있고 문이 닫혀 있지 않으면 이동가능 하므로 1(동쪽)
if (world[obj->in_room].dir_option[1] && world[obj->in_room].dir_option[1]->to_room &&
!IS_SET(world[obj->in_room].dir_option[1]->exit_info, EX_CLOSED)) {
dirs[1] = 1;
} else dirs[1] = -1;
// 현재 방에 남쪽으로 연결되어 있고, 남쪽에 이동할 방이 있고 문이 닫혀 있지 않으면 이동가능 하므로 2(남쪽)
if (world[obj->in_room].dir_option[2] && world[obj->in_room].dir_option[2]->to_room &&
!IS_SET(world[obj->in_room].dir_option[2]->exit_info, EX_CLOSED)) {
dirs[2] = 2;
} else dirs[2] = -1;
// 현재 방에 서쪽으로 연결되어 있고, 서쪽에 이동할 방이 있고 문이 닫혀 있지 않으면 이동가능 하므로 3(서쪽)
if (world[obj->in_room].dir_option[3] && world[obj->in_room].dir_option[3]->to_room &&
!IS_SET(world[obj->in_room].dir_option[3]->exit_info, EX_CLOSED)) {
dirs[3] = 3;
} else dirs[3] = -1;
// 현재 방에 위쪽으로 연결되어 있고, 위쪽에 이동할 방이 있고 문이 닫혀 있지 않으면 이동가능 하므로 4(위쪽)
if (world[obj->in_room].dir_option[4] && world[obj->in_room].dir_option[4]->to_room &&
!IS_SET(world[obj->in_room].dir_option[4]->exit_info, EX_CLOSED)) {
dirs[4] = 4;
} else dirs[4] = -1;
// 현재 방에 밑쪽으로 연결되어 있고, 밑쪽에 이동할 방이 있고 문이 닫혀 있지 않으면 이동가능 하므로 5(밑쪽)
if (world[obj->in_room].dir_option[5] && world[obj->in_room].dir_option[5]->to_room &&
!IS_SET(world[obj->in_room].dir_option[5]->exit_info, EX_CLOSED)) {
dirs[5] = 5;
} else dirs[5] = -1;
// 모든 방향을 검색한 후
for (i = 0; i < NUM_OF_DIRS; i++) {
if (dirs[i] != -1) {
found++;
}
}
// 출구가 없을 경우 종료
if (found == 0) {
return;
}
_Moving_:
random = number(0, 5); // 0-5 사이의 (방향과 같은 숫자의) 무작위로 숫자를 지정한다.
where = dirs[random]; // 지정한 방향의 방향을 특정하고
if (dirs[random] == -1) { // 특정한 방향에 출구가 없으면
goto _Moving_; // 출구가 있는 방의 번호가 나올 때 까지 반복한다.
}
r_num = EXIT(obj, where)->to_room; // 이동하려는 방의 리얼번호를 저장
a_zone = world[r_num].zone; // 이동하려는 방의 존 번호를 특정
b_zone = world[obj->in_room].zone; // 현재 방의 존 번호를 특정
if (a_zone != b_zone) { // 현재 있는 방의 존과 이동하려는 방의 존이 다르다면 이동하지 않고 종료
return;
}
sprintf(buf, "%s%s %s쪽으로 이동합니다.rn",
obj->short_description, check_josa(obj->short_description, 0),
han_dirs[where]);
send_to_room(buf, obj->in_room);
sprintf(buf, "%s%s 도착했습니다.rn",
obj->short_description, check_josa(obj->short_description, 0));
send_to_room(buf, r_num);
obj_from_room(obj);
obj_to_room(obj, r_num);
// 이동물건 설정 종료
} else { // 물건이 미확인 장소에 있으면
return; // 종료
}
}
}
글번호 | 제목 | 작성자 | 조회수 | 좋아요 | 싫어요 | 작성일 | |
---|---|---|---|---|---|---|---|
29 | TBAMUD 한글 아이디 저장 함수 | 성천사 | 180 | 0 | 0 | 2025-03-29 | |
28 | 신세계 64비트 난수 처리 | 성천사 | 178 | 0 | 0 | 2025-01-01 | |
27 | 접속금지, 접속허용 편의성 수정 | 성천사 | 205 | 0 | 0 | 2024-10-27 | |
26 | 신세계 텍스트 출력 [1] | 성천사 | 242 | 0 | 0 | 2024-08-06 | |
25 | 신세계 시체생성 | 성천사 | 209 | 0 | 0 | 2024-06-12 | |
24 | 삭제된 게시물입니다. | 성천사 | 147 | 0 | 0 | 2024-06-12 | |
23 | 신세계 C to VC6.0 | 성천사 | 368 | 0 | 0 | 2024-03-07 | |
22 | 신세계 장비위치 구하기 | 성천사 | 225 | 0 | 0 | 2024-03-04 | |
21 | 신세계 파일 존재여부 확인 | 성천사 | 282 | 0 | 0 | 2024-02-18 | |
20 | 신세계 맙타입 전투 | 성천사 | 321 | 0 | 0 | 2023-12-02 | |
19 | 신세계 addlog() | 성천사 | 265 | 0 | 0 | 2023-10-25 | |
18 | 신세계 캐릭터, 맙 이동 코드 | 성천사 | 273 | 0 | 0 | 2023-10-25 | |
17 | 신세계 지정번호의 물건 찾기및 제거하기 | 성천사 | 379 | 0 | 0 | 2023-05-07 | |
16 | 신세계 이동물건 [1] | 성천사 | 653 | 0 | 0 | 2022-12-30 | |
15 | 신세계 날씨변경 명령어 | 성천사 | 445 | 0 | 0 | 2022-12-25 | |
14 | [circle] 신세계 운영자 명령어 방청소 | 성천사 | 503 | 0 | 0 | 2022-10-08 | |
13 | [circle] 신세계 물건이름 | 성천사 | 531 | 0 | 0 | 2022-08-26 | |
12 | [circle] 신세계 공격대상 | 성천사 | 561 | 0 | 0 | 2022-08-19 | |
11 | [circle] 미확인장소 물건 수거 | 성천사 | 1036 | 0 | 0 | 2019-09-23 | |
10 | [circle] 신세계 포탈과 이동 명령어 [1] | 성천사 | 1472 | 0 | 0 | 2018-09-05 |