머드클럽
머드게임이란?
게임은 어떤 환경에서?
본격적으로 게임해 볼까?
배너교환
머드강좌
일반 머드강좌
성천사님의 머드강좌
혼님의 머드강좌
방울꽃님의 머드강좌
리트님의 머드강좌
2Soo님의 머드강좌
내머드소개하기
접속가능머드
내머드소개하기
자료실
접속 프로그램
머드소스
머드 유틸리티
기타
커뮤니티
공지사항
등업신청
머드클럽에바란다
자유 게시판
질문 AND 답변
머드클럽 갤러리
구인구직
머드게임소개
사신전(死神戰)
사신전 소개
사신전 맵
사신전 명령어 모음집
천명(天命)
천명 소개
천명 맵
천명 명령어 모음집
마이페이지
로그인
회원가입
계정찾기
로그인
회원가입
계정찾기
텍스트머드클럽
검색
RE: 자료실의 지도변환을 CircleMUD로 변환해 보신분?
울보천사
0
117
0
0
2024-08-25 21:05:08
<div lang="c" style="background:#eeeeee;border:1px solid #cccccc;padding:5px 10px;"> <p>#include "dg_olc.h"<br /> #include "comm.h"</p> <p>#define MAP_DIR "map/" // 맵 파일이 위치할 디렉토리<br /> #define WLD_DIR "map/" // WLD 파일을 저장할 디렉토리<br /> #define MAX_LINE_LEN 512 // 최대 한 줄의 길이<br /> #define MAX_ROWS 100 // 최대 100개의 행을 가정<br /> #define MAX_COLS 100 // 최대 100개의 열을 가정<br /> #define ROOM_DESC "공사중인 방~n현재 공사중으로 사용하고 있지 않은 방입니다.~n~n" // 방 설명<br /> #define WLD_EXTENSION ".wld" // WLD 파일 확장자</p> <p>typedef struct {<br /> int exists; // 방이 존재하는지 여부<br /> int north; // 북쪽 출구<br /> int south; // 남쪽 출구<br /> int east; // 동쪽 출구<br /> int west; // 서쪽 출구<br /> } Room;</p> <p>Room rooms[MAX_ROWS][MAX_COLS]; // 방 정보를 저장할 배열<br /> char map[MAX_ROWS][MAX_LINE_LEN]; // 맵 정보를 저장할 배열</p> <p>// 방 배열 초기화 함수<br /> void init_rooms(int max_row, int max_col) {<br /> for (int i = 0; i < max_row; i++) {<br /> for (int j = 0; j < max_col; j++) {<br /> rooms[i][j].exists = 0; // 방이 존재하지 않음<br /> rooms[i][j].north = -1; // 북쪽 출구 없음<br /> rooms[i][j].south = -1; // 남쪽 출구 없음<br /> rooms[i][j].east = -1; // 동쪽 출구 없음<br /> rooms[i][j].west = -1; // 서쪽 출구 없음<br /> }<br /> }<br /> }</p> <p>// UTF-8 문자 길이를 계산하는 함수<br /> int utf8_char_length(char *ch) {<br /> if ((ch[0] & 0x80) == 0) return 1; // 1-byte char (ASCII)<br /> else if ((ch[0] & 0xe0) == 0xc0) return 2; // 2-byte char<br /> else if ((ch[0] & 0xf0) == 0xe0) return 3; // 3-byte char<br /> else if ((ch[0] & 0xf8) == 0xf0) return 4; // 4-byte char<br /> return 1; // 기본적으로 1바이트로 설정 (안전성)<br /> }</p> <p>// 오른쪽 공백 제거 함수<br /> void trim_right(char *line) {<br /> int len = strlen(line);<br /> while(len > 0 && line[len - 1] == ' ') {<br /> line[len - 1] = '0';<br /> len--;<br /> }<br /> }</p> <p>// 공백 개수를 세는 함수<br /> int count_spaces(char *line) {<br /> int space_count = 0;<br /> for (int i = 0; i < strlen(line); i++) {<br /> if (line[i] == ' ') {<br /> space_count++;<br /> }<br /> }<br /> return space_count;<br /> }</p> <p>// 방을 정의하고 출구 설정<br /> void define_rooms_and_exits(int max_row, int max_col, struct char_data *ch) {<br /> for (int row = 0; row < max_row; row += 2) {<br /> int actual_col = 0; // 실제 열 위치를 추적<br /> for (int col = 0; col < max_col; ) {<br /> int char_len = utf8_char_length(&map[row][col]);<br /> char current_char[5] = {0};<br /> memcpy(current_char, &map[row][col], char_len);<br /> current_char[char_len] = '0';</p> <p> send_to_char(ch, "현재 위치 [%d, %d] 문자 (hex):", row, actual_col);<br /> for (int i = 0; i < char_len; i++) {<br /> send_to_char(ch, " %02x", (unsigned char)current_char[i]);<br /> }<br /> send_to_char(ch, "n");</p> <p> if (strcmp(current_char, "○") == 0) {<br /> int r = row / 2;<br /> int c = actual_col;</p> <p> rooms[r][c].exists = 1;<br /> send_to_char(ch, "방 [%d, %d] 존재합니다.n", r, c);</p> <p> // 남쪽 출구 확인 및 설정<br /> if (row + 2 < max_row) {<br /> int target_col = col;<br /> int spaces_to_skip = count_spaces(map[row]);</p> <p> if (spaces_to_skip > 0) {<br /> target_col += (spaces_to_skip / 2) * char_len;<br /> }</p> <p> int south_len = utf8_char_length(&map[row + 1][target_col]);<br /> char south_char[5] = {0};<br /> memcpy(south_char, &map[row + 1][target_col], south_len);<br /> south_char[south_len] = '0';</p> <p> if (strcmp(south_char, "│") == 0 || strcmp(south_char, "↓") == 0) {<br /> rooms[r][c].south = r + 1;<br /> rooms[r + 1][c].north = r;<br /> send_to_char(ch, "남쪽 방향: 심볼 인식됨 - %dn", south_len);<br /> } else {<br /> send_to_char(ch, "남쪽 방향: 심볼 없음n");<br /> }<br /> }</p> <p> // 동쪽 출구 확인 및 설정<br /> if (col + char_len < max_col) {<br /> int east_len = utf8_char_length(&map[row][col + char_len]);<br /> char east_char[5] = {0};<br /> memcpy(east_char, &map[row][col + char_len], east_len);<br /> east_char[east_len] = '0';</p> <p> if (strcmp(east_char, "─") == 0 || strcmp(east_char, "→") == 0) {<br /> rooms[r][c].east = c + 1;<br /> rooms[r][c + 1].west = c;<br /> send_to_char(ch, "동쪽 방향: 심볼 인식됨 - %dn", east_len);<br /> } else {<br /> send_to_char(ch, "동쪽 방향: 심볼 없음n");<br /> }<br /> }</p> <p> // 서쪽 출구 확인 및 설정<br /> if (col - char_len >= 0) {<br /> int west_len = utf8_char_length(&map[row][col - char_len]);<br /> char west_char[5] = {0};<br /> memcpy(west_char, &map[row][col - char_len], west_len);<br /> west_char[west_len] = '0';</p> <p> if (strcmp(west_char, "─") == 0 || strcmp(west_char, "←") == 0) {<br /> rooms[r][c].west = c - 1;<br /> rooms[r][c - 1].east = c;<br /> send_to_char(ch, "서쪽 방향: 심볼 인식됨 - %dn", west_len);<br /> } else {<br /> send_to_char(ch, "서쪽 방향: 심볼 없음n");<br /> }<br /> }</p> <p> // 북쪽 출구 확인 및 설정<br /> if (row - 2 >= 0) {<br /> int target_col = col;<br /> int spaces_to_skip = count_spaces(map[row]);</p> <p> if (spaces_to_skip > 0) {<br /> target_col += (spaces_to_skip / 2) * char_len;<br /> }</p> <p> int north_len = utf8_char_length(&map[row - 1][target_col]);<br /> char north_char[5] = {0};<br /> memcpy(north_char, &map[row - 1][target_col], north_len);<br /> north_char[north_len] = '0';</p> <p> if (strcmp(north_char, "│") == 0 || strcmp(north_char, "↑") == 0) {<br /> rooms[r][c].north = r - 1;<br /> rooms[r - 1][c].south = r;<br /> send_to_char(ch, "북쪽 방향: 심볼 인식됨 - %dn", north_len);<br /> } else {<br /> send_to_char(ch, "북쪽 방향: 심볼 없음n");<br /> }<br /> }<br /> } else {<br /> send_to_char(ch, "방이 없습니다. 위치: [%d, %d]n", row, actual_col);<br /> }</p> <p> col += char_len; // 다음 문자로 이동<br /> actual_col++; // 실제 열 위치 증가<br /> }<br /> }<br /> }</p> <p>// 맵 파일을 WLD 파일로 변환하는 함수<br /> void convert_map_to_wld(int start_num, const char *map_file, struct char_data *ch) {<br /> FILE *map_fp, *wld_fp;<br /> char wld_filename[MAX_LINE_LEN], map_path[MAX_LINE_LEN];<br /> int row = 0;<br /> int room_start = start_num * 100; // 방 번호 시작 값<br /> int max_col = 0, max_row = 0;</p> <p> // 맵 파일과 WLD 파일 경로 설정<br /> snprintf(map_path, sizeof(map_path), "%s%s", MAP_DIR, map_file);<br /> snprintf(wld_filename, sizeof(wld_filename), "%s%d%s", WLD_DIR, start_num, WLD_EXTENSION);</p> <p> // 맵 파일 열기<br /> map_fp = fopen(map_path, "r");<br /> if (!map_fp) {<br /> send_to_char(ch, "맵 파일을 열 수 없습니다: %sn", map_path);<br /> perror("fopen");<br /> return;<br /> }</p> <p> // 맵 파일을 읽고 최대 열과 행을 계산<br /> while (fgets(map[row], sizeof(map[row]), map_fp)) {<br /> map[row][strcspn(map[row], "rn")] = 0; // 줄 끝 문자를 제거<br /> trim_right(map[row]); // 오른쪽 공백 제거<br /> row++;<br /> }<br /> max_row = row;<br /> fclose(map_fp);</p> <p> // 최대 열 계산 (가장 긴 줄 기준)<br /> int max_cols_index = 0;<br /> for (int i = 0; i < max_row; i++) {<br /> int current_col = 0;<br /> int space_count = count_spaces(map[i]);<br /> for (int j = 0; j < strlen(map[i]); j += utf8_char_length(&map[i][j])) {<br /> if (map[i][j] != ' ') {<br /> current_col++;<br /> }<br /> }<br /> current_col += (space_count / 2); // 공백 처리<br /> if (current_col > max_col) {<br /> max_col = current_col;<br /> max_cols_index = i;<br /> }<br /> }</p> <p> int num_cols = max_col;</p> <p> send_to_char(ch, "최대 긴 열: %dn", num_cols);<br /> send_to_char(ch, "최대 긴 행: %dn", max_row);<br /> send_to_char(ch, "가장 긴 열을 가진 행의 인덱스: %dn", max_cols_index);<br /> <br /> init_rooms((max_row + 1) / 2, num_cols); // 방 배열 초기화</p> <p> define_rooms_and_exits(max_row, max_col, ch); // 방과 출구 설정</p> <p> // WLD 파일 생성<br /> wld_fp = fopen(wld_filename, "w");<br /> if (!wld_fp) {<br /> send_to_char(ch, "WLD 파일을 생성할 수 없습니다: %sn", wld_filename);<br /> perror("fopen");<br /> return;<br /> }</p> <p> // 방 정보를 WLD 파일에 기록<br /> for (int r = 0; r < (max_row + 1) / 2; r++) {<br /> for (int c = 0; c < num_cols; c++) {<br /> int room_num = room_start + (r * num_cols) + c;</p> <p> // 방이 존재하지 않아도 기본 방 정보를 생성하여 파일에 기록<br /> fprintf(wld_fp, "#%dn", room_num);<br /> fprintf(wld_fp, ROOM_DESC);<br /> fprintf(wld_fp, "%d 0 0 0 0 0n", start_num);</p> <p> if (rooms[r][c].exists) {<br /> if (rooms[r][c].north != -1) {<br /> fprintf(wld_fp, "D0n~n~n0 0 %dn", room_start + (rooms[r][c].north * num_cols) + c);<br /> }<br /> if (rooms[r][c].east != -1) {<br /> fprintf(wld_fp, "D1n~n~n0 0 %dn", room_start + (r * num_cols) + rooms[r][c].east);<br /> }<br /> if (rooms[r][c].south != -1) {<br /> fprintf(wld_fp, "D2n~n~n0 0 %dn", room_start + (rooms[r][c].south * num_cols) + c);<br /> }<br /> if (rooms[r][c].west != -1) {<br /> fprintf(wld_fp, "D3n~n~n0 0 %dn", room_start + (r * num_cols) + rooms[r][c].west);<br /> }<br /> }</p> <p> fprintf(wld_fp, "Sn");<br /> }<br /> }</p> <p> fprintf(wld_fp, "$n"); // 파일 끝에 $ 추가<br /> fclose(wld_fp);</p> <p> send_to_char(ch, "맵 크기: 가로 %d x 세로 %d, 총 %d 방 생성됨.n", num_cols, (max_row + 1) / 2, num_cols * ((max_row + 1) / 2));<br /> }</p> <p>ACMD(do_map_convert) {<br /> char arg[MAX_INPUT_LENGTH] = {'0'}, arg2[MAX_INPUT_LENGTH] = {'0'};<br /> int start_num;</p> <p> two_arguments(argument, arg, sizeof(arg), arg2, sizeof(arg2));</p> <p> if (!*arg || !*arg2) {<br /> send_to_char(ch, "사용법: <시작번호> <맵파일> 지도변환rn");<br /> return;<br /> }</p> <p> start_num = atoi(arg);<br /> convert_map_to_wld(start_num, arg2, ch);<br /> send_to_char(ch, "%s 맵을 %d.wld로 변환되었습니다.rn", arg2, start_num);<br /> }<br /> </p> </div> <p> </p> <p> </p> <p>생각처럼 안되네요.<br /> 아직 안되는 코드입니다. ㅎㅎㅎ </p>
0
0
새글
답변
수정
삭제
최신목록
전체목록
RE: tintin++ 직접 컴파일 해 보신 분 있나요?
RE: 자료실의 지도변환을 CircleMUD로 변환해 보신분?
0
Comments
-표시할 내용이 없습니다.-
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
댓글에 답하기
입력
닫기
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 954개 / 검색된 게시물: 954개
질문 답변 외 글은 자유 게시판에 올려 주세요...
mySQL지원하는 머드 서버 아시는분 있으신가요?
0
120
0
0
울보천사
2024-09-22
자료실의 지도변환을 CircleMUD로 변환해 보신분?
2+4
91
0
0
울보천사
2024-08-25
┗
RE: 자료실의 지도변환을 CircleMUD로 변환해 보신분?
0
118
0
0
울보천사
2024-08-25
┗
삭제된 게시물입니다.
0
67
0
0
울보천사
2024-08-25
Tbamud에서 트리거에서 한글 동작하도록 해 보신분 있나요?
1
61
0
0
울보천사
2024-08-16
TbaMUD 의 트리거 파일에서 조사처리 해보신분?
0
73
0
0
울보천사
2024-08-11
┗
RE: TbaMUD 의 트리거 파일에서 조사처리 해보신분?
0
62
0
0
울보천사
2024-08-11
OUD 게임 실행은 어떻게 해야할까요?
1
146
0
0
추억의단군
2024-07-10
HanLP 드라이버를 리눅스에서 돌리려면 어떤 환경이어야 하나요?
2
234
0
0
가짜으르릉
2024-06-16
tintin++ 직접 컴파일 해 보신 분 있나요?
2+1
438
0
0
울보천사
2024-01-14
┗
RE: tintin++ 직접 컴파일 해 보신 분 있나요?
0
81
0
0
울보천사
2024-09-07
┗
삭제된 게시물입니다.
0
69
0
0
고냉이
2024-09-07
ChatGtp 가 알려준 숫자 한글 변환 코드
0
320
0
0
울보천사
2023-11-28
┗
RE: 숫자 한글 변환 코드
0
196
0
0
울보천사
2024-01-02
┗
또 다른 숫자 한글 변환코드. 현재 사용중
0
227
0
0
울보천사
2024-01-03
UTF-8 MUD 서버에 Windows 에서 접속할 때
1
345
0
0
울보천사
2023-11-17
삭제된 게시물입니다.
0
154
0
0
울보천사
2023-11-17
헌터 소스 질문
0
602
0
0
변인수
2023-01-14
tintin사용중인데..머드접속을 못하고잇네요..
1
979
0
0
강호묵시록사자
2022-12-19
이프온라인 초보 질문
0
487
0
0
변인수
2022-06-17
1
2
3
4
5
6
7
8
9
10
다음
건너뜀
검색
글쓰기
최신목록
전체목록
시작일
종료일
검색어
이름
제목
내용
검색
닫기
로그인
회원가입
계정찾기
개인정보처리방침
이용약관
PC화면
Copyright (c) 텍스트머드클럽. All rights reserved.
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
닉네임으로 입력
내용
쪽지가 도착하였습니다.
쪽지함
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--