레벨을 32767까지 가능하게

2007.04.12 13:01

그리움 조회 수:200 추천:56

───────────────────────────────────────
제 목 : [패치] 레벨을 32767 까지 가능하게 찬성 : 0 반대 : 0
올린이 : croaky (서민철 ) 읽음 : 28 날짜 : 99/09/04 03:32
------------------------------------------------------------------------------

이 패치는 무한에서의 레벨을 특별한 변수 추가나 변수형 변환등의 작업을
하지 않고, 기존의 변수를 이용하여 최대 32767까지 가능하게 해주는 패치입니다.

물론, 이전에 제가 공개한 패치들처럼 이미 소스에 많은 수정을 한 사람들을
위해서, 패치로 만들지 않고, 고치는 방법을 적습니다.

아래의 코드에 대한 저작권은 본인에게 있으며, 상업적 목적의 머드에서는
사용할수 없습니다. 무료 운영중인 머드에서 사용시, 자유롭게 사용할수 있으나,
아래의 코드로 인해 발생되는 문제에 대해서 제가 반드시 답변을 한다거나
책임을 지지는 않습니다.
struct 를 손보는 패치이므로, 안전을 위해서 모든 데이타들을 백업을 받아두신후
패치를 적용시키기를 권합니다. 간단히 해본 테스트에선 문제없이 돌아갔으나,
만약의 사태라는 것이 있으므로, 반드시 백업을 받으신후 패치를 적용하시기
바랍니다. 이 패치로 인해 문제가 발생했을때, 저는 책임을 지지 않습니다.

1999년 9월 3일.
서민철

-----------------------------------------------------------
Wicked Angel.. Network Programmer, Game Designer
E-Mail Address : croaky@frog.sarang.net croaky@nownuri.net
Home Page : http://frog.sarang.net/
-----------------------------------------------------------


1. mstruct.h

typedef struct creature {
   char name[80];
   char description[80];
   char talk[80];
   char password[15];
   char key[3][20];
   short fd; /* Socket number */
// unsigned char level;
   unsigned char old_level; // level -> old_level 로 바꾼다.
   char type; /* Creature type */
   char class;
   char race;
/* 중략 */
   struct object *ready[MAXWEAR];/* Worn/readied items */
   struct daily daily[10]; /* Daily use variables */
   struct lasttime lasttime[45]; /* Last-time-used variables */
   struct creature *following; /* Creature being followed */
#define level lasttime[44].misc // 추가해줌.
/* 하략 */

---
첫번째 단계로, 기존의 level 이라는 변수를 old_level 이라는 이름으로 바꿉니다.
두번째로, #define level lasttime[44].misc 을 추가해줍니다.
define 문은 어느곳에 두셔도 상관없지만, 원래 lasttime 변수를 사용하는 것이므로
찾기 쉽도록 lasttime 아래에 정의해둡니다.

* 위에서 44 라는 숫자는 제가 임의로 적은 숫자입니다. 무한 소스에서 사용하지
않는 부분의 변수를 사용하는 것이지만, 개인적으로 소스를 고치다 위의 변수를
사용했을 가능성도 배제할수 없으므로, 안전을 위해서 확인을 해보시길 권합니다.
src 디렉토리에서, [grep misc *.c] 해보신뒤 ply_ptr 혹은 crt_ptr 등의
creature 함수에서 misc 라는 변수명을 사용하는지 확인한 뒤, 만일 사용할시에는
lasttime[] 의 몇번째 misc 를 사용하는건지를 보시고, 확실히 사용하지 않는
변수를 적어서 사용하시기를 바랍니다.

2. player.c

void init_ply(ply_ptr)
creature *ply_ptr;
{
/* 중략 */
   if(ply_ptr->class >= DM && strcmp(ply_ptr->name, DMNAME) &&
      strcmp(ply_ptr->name, DMNAME2) && strcmp(ply_ptr->name, DMNAME3) &&
      strcmp(ply_ptr->name, DMNAME4) && strcmp(ply_ptr->name, DMNAME5) &&
      strcmp(ply_ptr->name, DMNAME6) && strcmp(ply_ptr->name, DMNAME7))
       ply_ptr->class = 1;

   if(!strcmp(ply_ptr->name, DMNAME) || !strcmp(ply_ptr->name, DMNAME2) ||
     !strcmp(ply_ptr->name, DMNAME3) || !strcmp(ply_ptr->name, DMNAME4) ||
     !strcmp(ply_ptr->name, DMNAME5) || !strcmp(ply_ptr->name, DMNAME6) ||
     !strcmp(ply_ptr->name, DMNAME7)) {
       ply_ptr->class = DM;
   }
   else if(ply_ptr->class >= DM || ply_ptr->class ==0) {
       /* 불법 아이디 : 직업 이상 */
       t = time(0);
       strcpy(str, (char *)ctime(&t));
       str[strlen(str)-1] = 0;
       log_f("%s : ### %s 불법아이디(직업=%d)\n",str,
           ply_ptr->name,ply_ptr->class);
   }

/* 여기서부터 추가 */
   if(ply_ptr->level == 0) {
       ply_ptr->level = ply_ptr->old_level;
   }
/* 여기까지 */
/* 하략 */

---
init_ply() 함수의 앞쪽에 위의 부분을 추가해줍니다.
원래 레벨을 새로운 변수에 저장을 시켜주는 부분입니다.

3. files2.c

int load_crt(index, mon_ptr)
int index;
creature **mon_ptr;
{
/* 중략 */
/* 제일 아래쪽 부분 */
   (*mon_ptr)->lasttime[LT_HEALS].ltime = time(0);
   (*mon_ptr)->lasttime[LT_HEALS].interval = 60L;
   (*mon_ptr)->first_enm= 0;

/* 여기서부터 추가 */
   if((*mon_ptr)->level == 0) {
       (*mon_ptr)->level = (*mon_ptr)->old_level;
   }
/* 여기까지 추가 */

   return(0);

}

---
2번에서 사용자의 레벨을 고쳤으므로, 이번에는 몹의 레벨을 바꿉니다.

4. misc.c

int exp_to_lev(exp)
long exp;
{
   int Level = 1; // 원래 변수명 level -> Level 로 바꿈.

   while (exp >= needed_exp[Level-1] && Level < MAXALVL)
       Level++;
   if (Level >= MAXALVL) {
       Level = (exp-needed_exp[MAXALVL-2])/5000000+MAXALVL;
   }

   return(MAX(1,Level));
}

---
level 을 위에서 define 해뒀기 때문에, 컴파일시 에러가 생깁니다.
따라서, level 을 지역변수로 사용할 경우에는 이름을 바꿔줘야 합니다.
(다행이도 level을 지역변수로 쓰는건 한군데 밖에 없습니다.)

5. make clean;make

---
level 은 전체적으로 영향을 주는 변수이므로 make clean 한후 컴파일하여
전체 컴파일을 새로 해줍니다.

---
이렇게 하면, 사용자가 새로 접속할때마다 레벨을 체크해서 새로운 변수로
바꿔주기 때문에 머드가 돌아가는데는 문제가 없습니다.
다만, 패치를 적용시킨후 한번도 접속하지 않은 사용자의 경우에는 레벨이
제대로 표시가 되지 않으며, 에디터나 리스트 등에서 제대로 작동하지 않게
됩니다.
에디터의 경우에는 위의 것을 참고하여 새로 컴파일하시기 바라며, 리스트는
약간 신경써서 손을 보셔야 할 것입니다.
패치를 적용한 에디터로 몹을 만들 경우에는 level 변수에 저장이 되며,
기존에 있던 몹들의 경우에는 old_level 변수에 저장되어 있고, level 은 0인
상태로 있기 때문입니다.
이것을 참고하여, 리스트도 적당히 수정하여 새로 컴파일해서 쓰시기 바랍니다.

홈지기 "그륨"


XE Login