[기타]HanLP 지도명령 mudos 버젼으로 바꾸기.
member photo 천유 0 3,102 0 2004-11-21 23:21:22
얼마전에 지도명령의 필요성을 느껴서
HanLP의 지도명령어를 mudos버젼으로 바꿔봣습니다.

음, 그래서 어쩌다보니 공개를 -- 머 공개를껏도 없겟네요;;





#include <구조.h>

string *res = ({ });
int *room_num = ({ });
void ch_exit(int roomnum, string room);

string map()
{
                int j=0;
                string arg, maptext="      ";

                foreach( arg in res ) {
                                j += 1;
                                maptext += arg;
                                if( j == 11 ) {
                                                maptext += "\n      ";
                                                j = 0;
                                }
                }
                return maptext;
}

void exit_mark(object ob, mapping exits, int roomnum, string short_name)
{
  int i;
  string *dir, short, tmp;
  

  if( res[roomnum] == "      " ) {
      if( !short_name || short_name == "") short = " ???? ";
      else {
          if( strlen(short_name) >= 5 ) {
              if( short_name[4] == 32 )
                  short = " "+short_name[0..3]+" ";
              else
                  short = short_name[0..5];
          }
          else
              short = sprintf("%|6s",short_name);
      }
      
      if( roomnum == 60 ) res[roomnum] = ""+short+"";
      else res[roomnum] = ""+short+"";
  }
  else return;

  dir = ob->getPureExits();

  for (i = 0; i < sizeof(exits); i++) {
      tmp = ob->getExit(dir[i]);
      switch (dir[i]) {
        case "동":
            if( res[roomnum+1] == "      " ) res[roomnum+1] = " ─〉 ";
            else res[roomnum+1] = " ── ";
            ch_exit(roomnum+2,tmp);
            break;
        case "서":
            if( res[roomnum-1] == "      " ) res[roomnum-1] = " 〈─ ";
            else res[roomnum-1] = " ── ";
            ch_exit(roomnum-2,tmp);
            break;
        case "남":
            if( res[roomnum+11] == "      " ) res[roomnum+11] = "  ↓  ";
            else res[roomnum+11] = "  │  ";
            ch_exit(roomnum+22,tmp);
            break;
        case "북":
            if( res[roomnum-11] == "      " ) res[roomnum-11] = "  ↑  ";
            else res[roomnum-11] = "  │  ";
            ch_exit(roomnum-22,tmp);
            break;
        case "북동":
            if( res[roomnum-10] == "      " ) res[roomnum-10] = "  ↗  ";
            else res[roomnum-10] = "  /  ";
            ch_exit(roomnum-20,tmp);
            break;
        case "북서":
            if( res[roomnum-12] == "      " ) res[roomnum-12] = "  ↖  ";
            else res[roomnum-12] = "  \  ";
            ch_exit(roomnum-24,tmp);
            break;
        case "남동":
           if( res[roomnum+12] == "      " )  res[roomnum+12] = "  ↘  ";
           else res[roomnum+12] = "  \  ";
           ch_exit(roomnum+24,tmp);
           break;
        case "남서":
            if( res[roomnum+10] == "      " ) res[roomnum+10] = "  ↙  ";
            else res[roomnum+10] = "  /  ";
            ch_exit(roomnum+20,tmp);
            break;
        case "위":
            if( res[roomnum] == "  ∨  " )
                res[roomnum] = "  ↕  ";
            else
                res[roomnum] = "  ∧  ";
        break;
        case "아래":
        case "밑":
        if(res[roomnum] == "  ∧  ")
            res[roomnum] = "  ↕  ";
        else
            res[roomnum] = "  ∨  ";
        break;
      }
  }
  return;
}

void ch_exit(int roomnum, string room) {

                object ob;
                string short_name;
                mapping exit;

                if( !roomnum || roomnum < 0 || !room || room == "") return ;
                if( member_array(roomnum,room_num) != -1 ) {
                                ob = find_object(room);
                                if( !ob ) {
                                                catch( call_other( room, "???" ) );
                                                ob = find_object(room);
                                                if( !ob ) return;
                                }
                                exit = ob->getExits();
                                if( exit && sizeof(exit) > 0 ) {
                                                short_name = ob->getShort();
                                                if( !short_name ) short_name = "....";
                                                exit_mark(ob, exit, roomnum, short_name);
                                }
                                return;
                }
                return;
}

mixed CMD(string arg) {

                object room;
                mapping exits;
                string short_name, str;

                room = environment(this_player());
                if (!room) return notify_fail("* 아무것도 보이지 않습니다.\n");

                exits = room->getExits();
                if( !exits || sizeof(exits) < 1 ) {
                                return notify_fail("* 이곳은 출구가 없는 곳입니다.\n");
                }

                room_num = ({
                                                12,14,16,18,20,
                                                34,36,38,40,42,
                                                56,58,60,62,64,
                                                78,80,82,84,86,
                                                100,102,104,106,108,
                                                });
                res = ({  
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      ",
                                                "      ","      ","      ","      ","      ","      ","      ","      ","      ","      ","      "
                                                });
                exits = room->getExits();
                short_name = room->getShort();
                if(exits) exit_mark(room, exits, 60, short_name);
                str = "\n"+map()+"\n";
                write(str);
                return 1;
}



음 별건아니지만 많은 도움 됬으면좋겟습니다. ㅎㅎ

한엘피 지도명령이랑 쪼금만 비교해보면
모두 아실것이기에 따로 설명은 안할게요

흠흠;; 제가글쓰면서 바로 수정한소스라-_-;;;;

한가지 실수해서 수정했습니다;;
int cmd(string arg) -> mixed CMD(string arg)
이렇게 고쳐줘야죠;;;;
0
0Comments
-표시할 내용이 없습니다.-
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 109개 / 검색된 게시물: 109개
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
내용
쪽지가 도착하였습니다.
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--