개량형 우체국

2007.04.12 13:00

그리움 조회 수:202 추천:55

/*
* 무한대전에서의 우체국 시스템 개량
*
* 이것은 무한대전의 소스로 이런 우체국 시스템도 가능하다는 것을 보여주기
* 위해서 한번 만들어본 것입니다.
* 현재 운영중인 무한대전 또는 "무한대전 소스를 수정한 머드" 들 중에서
* 상업적으로 사용돼는 곳을 제외하면, 누구나 이 소스를 사용할수 있습니다.
* 만약, 이 소스를 상업적 용도의 (돈을 받는) 머드에서 사용할 경우에는,
* 제가 저작권을 내세울수 있다는 것을 명심하시기 바랍니다.
*
* 문의 사항은 "croaky@ecstasy.co.kr" 로 해주시기 바랍니다.
*
* Croaky. 1998년 1월 16일
*/

/************/
/* post.c */
/************/

#include /* 이걸 추가시켜주세요. 안넣어도 관계는 없지만요. */

int postsend(ply_ptr, cmnd) /* 편지보내기 */
creature *ply_ptr;
cmd *cmnd;
{
   FILE *fp;
   room *rom_ptr;
   char file[80];
   int fd, ff, i;
   long t;
   char *date;

   fd = ply_ptr->fd;
   rom_ptr = ply_ptr->parent_rom;

   if(!F_ISSET(rom_ptr, RPOSTO)) {
       print(fd, "여기는 우체국이 아닙니다.\n");
       return(0);
   }

   if(cmnd->num < 2) {
       print(fd, "누구한테 편지를 보내시려구요?\n");
       return(0);
   }

   cmnd->str[1][0] = up(cmnd->str[1][0]);
   sprintf(file, "%s/%s/%s", PLAYERPATH,first_han(cmnd->str[1]),cmnd->str[1]);
   ff = open(file, O_RDONLY, 0);

   if(ff < 0) {
       print(fd, "그런 사용자는 없습니다.\n");
       return(0);
   }

   close(ff);

   print(fd, "편지 내용을 입력하십시요. 문장처음에 [.]을 치시면 편지쓰기를 종료
합니다.\n각 행은 80자를 넘길 수 없습니다.\n-: ");

   t = time(0);
   date = ctime(&t);

   for(i=0;i<24;i++)
   if(date[i] == ' ')
       date[i] = '_';
   date[24] = 0;
   sprintf(file, "%s/%s", POSTPATH, cmnd->str[1]);
   fp = fopen(file, "a");
   fprintf(fp, "%s %s\n", ply_ptr->name, date);
   fclose(fp);

   sprintf(Ply[fd].extr->tempstr[0], "%s/%s_%s", POSTPATH, cmnd->str[1], date);

   F_SET(Ply[fd].ply, PREADI);
   output_buf();
   Ply[fd].io->intrpt &= ~1;
   Ply[fd].io->fn = postedit;
   Ply[fd].io->fnparam = 1;
   return(DOPROMPT);

}

void postedit(fd, param, str)
int fd;
int param;
char *str;
{
   char outstr[85], datestr[40];
   long t;
   int ff;

   if(str[0]=='.') {
       F_CLR(Ply[fd].ply, PREADI);
       print(fd, "편지를 보냈습니다.\n");
       RETURN(fd, command, 1);
   }

   ff = open(Ply[fd].extr->tempstr[0], O_CREAT | O_APPEND | O_RDWR, ACC);
   if(ff < 0)
       merror("postedit", FATAL);

   if(param == 1) {
       time(&t);
       strcpy(datestr, (char *)ctime(&t));
       datestr[strlen(datestr)-1] = 0;
       sprintf(outstr, "\n---\n%s (%s)님에게서의 편지:\n\n",
           Ply[fd].ply->name, datestr);
       write(ff, outstr, strlen(outstr));
   }

   strncpy(outstr, str, 79);
   outstr[79] = 0;
   strcat(outstr, "\n");

   write(ff, outstr, strlen(outstr));

   close(ff);

   print(fd, ": ");

   output_buf();
   Ply[fd].io->intrpt &= ~1;
   RETURN(fd, postedit, 2);
}

int postread(ply_ptr, cmnd) /* 편지받기 */
creature *ply_ptr;
cmd *cmnd;
{
   FILE *fp;
   room *rom_ptr;
   object *obj_ptr;
   char file[80], name[15], date[25];
   int fd;

   fd = ply_ptr->fd;
   rom_ptr = ply_ptr->parent_rom;

   if(!F_ISSET(rom_ptr, RPOSTO)) {
       print(fd, "이곳은 우체국이 아닙니다.\n");
       return(0);
   }
   strcpy(file, POSTPATH);

   strcat(file, "/");
   strcat(file, ply_ptr->name);
   if(!file_exists(file)){
       print(fd,"받은 편지가 없습니다.\n");
       return(0);
   }
   else {
       sprintf(file, "%s/%s", POSTPATH, ply_ptr->name);
       fp = fopen(file, "r");
       while(1) {
           name[0] = 0;
           date[0] = 0;
           fscanf(fp, "%s", name);
           if(name[0] == 0) break;
           fscanf(fp, "%s", date);
           if(date[0] == 0) break;
           load_obj(20, &obj_ptr);
   /* load_obj 에서의 숫자는 대충 빈번호의 아이템으로 해주면 돼요. */
           obj_ptr->type = SCROLL;
           obj_ptr->adjustment = -100;
           sprintf(obj_ptr->name, "편지");
           sprintf(obj_ptr->description, "%s님에게서 온 편지입니다.", name);
           sprintf(obj_ptr->use_output, "%s_%s", ply_ptr->name, date);
           add_obj_crt(obj_ptr, ply_ptr);
           print(fd, "편지를 받았습니다.\n");
       }
       fclose(fp);
       unlink(file);
   }
}

/* postdelete 함수는 필요없으므로 깨끗이 지워버려도 돼요. */
/* 그리고, global.c 에서도 편지삭제 라는 명령부분을 지우시고요. */


/****************/
/* magic1.c */
/****************/

int readscroll(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
   object *obj_ptr;
   int (*fn)();
   long i, t;
   int fd, n, match=0, c, splno;

   char str[80]; /* 추가부분 */

   fd = ply_ptr->fd;
   fn = 0;

   if(cmnd->num < 2) {
       if(cmnd->val[0]>1) {
           obj_ptr = find_obj(ply_ptr,ply_ptr->parent_rom->first_obj,
                          "게시판",1);
           if(!obj_ptr) {
               print(fd,"무엇을 읽습니까?");
               return 0;
           }
           board_obj[fd]=obj_ptr;
           return(read_board(ply_ptr,cmnd));
       }
       print(fd, "무엇을 읽습니까?\n");
       return(0);
   }
   if(F_ISSET(ply_ptr, PBLIND)) {
       ANSI(fd, RED);
       print(fd, "\n당신은 그것을 읽을 수 있는 능력이 없습니다.\n");
       ANSI(fd, WHITE);
       return(0);
   }
   obj_ptr = find_obj(ply_ptr, ply_ptr->first_obj,
              cmnd->str[1], cmnd->val[1]);

   if(!obj_ptr || !cmnd->val[1]) {
       for(n=0; n             if(!ply_ptr->ready[n]) continue;
           if(EQUAL(ply_ptr->ready[n], cmnd->str[1]))
               match++;
           else continue;
           if(match == cmnd->val[1] || !cmnd->val[1]) {
               obj_ptr = ply_ptr->ready[n];
               break;
           }
       }
   }

   if(!obj_ptr) {
       print(fd, "\n 그런것이 존재하지 않습니다.\n");
       return(0);
   }

   if(obj_ptr->special) {
       n = special_obj(ply_ptr, cmnd, SP_MAPSC);
       if(n != -2) return(MAX(0, n));
   }

   if(obj_ptr->type != SCROLL) {
       print(fd, "\n이것은 문서구가 아닙니다.\n");
       return(0);
   }

/* 여기서부터 추가 */

   if(obj_ptr->adjustment == -100) {
       sprintf(str, "%s/%s", POSTPATH, obj_ptr->use_output);
   view_file(fd, 1, str);
       return(DOPROMPT);
   }

/* 여기까지를 추가해주세요. */

/* readscroll() 원래대로 계속 */

   return(0);
}

/*******************/
/* command2.c */
/*******************/

int burn(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
   room *rom_ptr;
   object *obj_ptr, *cnt_ptr;
   int fd, n, match=0;
   long t;
   char file[80]; /* 추가부분 */

   fd = ply_ptr->fd;

   if(cmnd->num < 2) {
       print(fd, "무엇을 태우시려구요?");
       return(0);
   }
   t=time(0);
   if(ply_burn_time[fd]>t) {
       please_wait(fd,ply_burn_time[fd]-t);
       return 0;
   }

   rom_ptr = ply_ptr->parent_rom;
   F_CLR(ply_ptr, PHIDDN);

   obj_ptr = find_obj(ply_ptr, ply_ptr->first_obj,
              cmnd->str[1], cmnd->val[1]);

   if(!obj_ptr) {
       print(fd, "당신은 그런것을 갖고 있지 않습니다.");
       return(0);
   }
   if(F_ISSET(obj_ptr, ONOBUN)) {
       print(fd, "소각할수 없는 아이템입니다.");
       return(0);
   }
/* 임무아이템 버리지 못하게 함 */
   if(obj_ptr->questnum && ply_ptr->classshotscur > 0) {
       print(fd, "임무 아이템은 태우지 못합니다.");
       return(0);
   }
   if(F_ISSET(obj_ptr, ONEWEV)
       && ply_ptr->class < SUB_DM && obj_ptr->shotscur > 0) {
       print(fd, "이벤트 아이템은 소각할수 없습니다.");
       return(0);
   }

/* 추가 부분 */
   if(obj_ptr->type == SCROLL && obj_ptr->adjustment == -100) {
       sprintf(file, "%s/%s", POSTPATH, obj_ptr->use_output);
       unlink(file);
   }
/* 여기까지 추가 */

   del_obj_crt(obj_ptr, ply_ptr);
   print(fd, "당신은 %1i%j 태웠습니다.", obj_ptr,"3");
   broadcast_rom(fd, rom_ptr->rom_num, "\n%M%j %1i%j 태웠습니다.",
             ply_ptr,"1", obj_ptr,"3");
   free_obj(obj_ptr);
   ply_ptr->gold += 4;
   ply_ptr->experience += 1;
   print(fd, "\n당신은 약간의 상금과 경험을 받았습니다.");
   if(((time(0)+mrand(1,100))%250)==9) {
       print(fd,"\n신이 당신의 정성이 갸륵해서 경험치와 돈벼락을 내립니다.");
       broadcast_rom(fd,rom_ptr->rom_num,
           "\n신이 %M에게 경험치와 돈벼락을 내립니다.", ply_ptr);
       ply_ptr->gold+=100000;
       ply_ptr->experience+=10;
   }
   ply_burn_time[fd]=t+2;

   return(0);
}


-----

보충설명>

다른 사람이 편지를 보내면, 그 내용은 각각의 화일로 저장이 돼며,
받는 사람이 우체국에서 "편지받기"를 하면, 편지 라는 아이템이 생성돼어
자신의 소지품에 추가가 됩니다.
편지의 내용을 보는 것은, [편지 ### 읽어] 를 통해서. 내용을 볼수 있으며,
편지 아이템을 소각했을때는, 그 편지의 내용도 지워지게 했습니다.
따라서, 그 편지라는 아이템을 계속적으로 가지고 있다면, 언제든지 읽을수
있으며, 필요없는 편지는 소각을 통해서 없앨수 있습니다.

이때 주의사항은, 사용자정보 명령에서 "읽지않은 편지 시간" 나오는 것으로,
이 부분까지는, 제가 고치지 않습니다.
참고라면, 받은 편지가 있다 없다라는것은. 위의 편지받기 함수를 참고하시면
됩니다.
이걸로 편지 시스템 바꾸실때는.. 기존의 편지 데이터를 전부 없애고 하세요.

위의 소스는 원본 소스 그대로에 추가한것이며, 위에 언급한 화일의 함수부를
고치시면 됩니다. 패치로 만들려하니, 이미 많은 분들이 소스를 고쳤을꺼라서
그냥 이렇게 올립니다.
그리고, 이걸 만들면서, 컴파일은 해보았으나, 실제로 실행은 시켜보지 않아서
제대로 잘 돌아갈지는 모르겠네요. ^^;
제대로 돌아가지 않을때는, 저한테 항의를 하지 마시고, 스스로 찾아보세요.
그다지 어렵게 짠것도 아니니까요.
그리고, 실제로 제가 만든 머드에서는 이런 형식의 우체국을 만들어서 사용중
이니, 큰 문제는 없을꺼라 생각합니다.

홈지기 "그륨"


XE Login