Header

  1. View current page

    꿈꾸는자의 생각의 파편과 나열...

Profile_image?t=1222470982&type=small
꿈꾸는자가 생각하는 생각의 파편들과... 그가 꿈꾸는 새상들... 그리고, 끄적 끄적~
2

게임서버에 사용된 게임 캐릭터 클래스 정보

 

게임서버에서 가장 중요한 게임캐릭터 클래스로 서버에서 클라이언트의 캐릭터및 서버에서 움직이는 모든 캐릭터를 관리하는 클래스는 다음과 같이 구성되었다.

 

  TGMovable = class(TGObject)
  private
  protected
    FTime : DWORD;         // GameObject가 마지막으로 갱신된 시간
    FLatency : DWORD;      //
    FTargetPos : TGPos; // GameObject의 이동할 좌표
    FDirection : Extended; // 방향을 사용할 경우 방향 벡터
    FHP : Integer;         // 이동하는 객체의 HP
    FMP : Integer;         // 이동 객체의 MP
    FMaxHP : Integer;
    FMaxMP : Integer;

    //이동 하려는 좌표가 충돌 되는지 체크한다. 충돌 되면 True
    function CheckIntersect( TX, TY, TZ: Extended ): Boolean; virtual;
    procedure UpdateMove;   //위치를 업데이트 한다.

이 클래스는 실제 게임서버에서 유저, 몬스터, 포탈, 상점등의 캐릭터를 관리하고 있었고, 필요한 세부적인 자료들도 마찬가지로 가지고 있다.

잠깐 함수가 나오는데 실제 좌표체크시에도 3차원 좌표로 체크하였다.

 

이 TGMovable은 TGobject를 상속받았는데 그 클래스는 다음과 같아.

 

  TGObject = class(TObject)
  protected
    FUID : String;         // GameObject의 고유 ID
    FMDLName : String;      // GameObject의 모델명.
    FState : Integer;      // GameObject의 현재 상태
    FPos : TGPos;       // GameObject의 현재 좌표
    FData : Pointer;

 

좀더 상위클래스는 TGObject는 기본적인 상태정보만을 가진다..

 

  TGPos = record
    X : Extended;
    Y : Extended;
    Z : Extended;
  end;

 

좌표체계는 처음부터 하늘을 생각해서 3차원으로 구성하였다.

 

  //GameObject의 종류
  GOKUNKNOWN = 0;
  GOKPLAYER = 1;
  GOKMONSTER = 2;
  GOKNPC = 3;
  GOKBANK = 4;
  GOKSTORE = 5;
  GOKPORTAL = 6;
  GOKITEMBOX = 7;
  GOKEFFECT = 8;
  GOKFIREBALL = 9;

 플레이어 정보부터 은행과 상점정보, 그리고 이펙트정보를 구분하고..

세부적인 공격용 모션들을 구분하고 있었다.

아마도.. 10,11,12.. 이렇게 관련 속성이 늘어나는 구조였다.

후에.. 이 부분이 더 많이 필요하면 다른 구성을 하겠지만.

굳이 그럴필요까지는.. (쿨럭~)

 

  //이동 가능 객체 상태 Movable Object State
  MOSSTAND    = 0;   //서있는 상태
  MOSMOVE     = 1;   //이동하고 있는 상태
  MOSATTACK   = 2;   //공격하고 있는 상태
  MOSATTACKED = 3;   //공격 받고 있는 상태
  MOSSITDOWN  = 4;   //앉아 있는 상태
  MOSDEATH    = 5;   //죽은 상태

 캐릭터의 상태정보이다. 아주 기본적인것들..

 

////////////////////////////////////////////////////////////////////////////////
// 아이템의 용도 TItemData.Use
////////////////////////////////////////////////////////////////////////////////
  IUATTACK  = 0;   //공격용
  IUDEFENCE = 1;   //방어용
  IUPOTION  = 2;   //소모품
  IUNOITEM  = -1;

 아이템의 용도를 구분하는 구분값이었다.

공격, 방어, 소모.. 그리고.. 장식용? 하여간..  그렇게 구분했다.

 

////////////////////////////////////////////////////////////////////////////////
// 아이템의 계열  TItemData.Cls
////////////////////////////////////////////////////////////////////////////////

  IKSHORTSWORD = 0;      //단검류  -> 공격 무기 -> 왼쪽손
  IKSWORD      = 1;      //검류
  IKSPEAR      = 2;      //창류
  IKAXE        = 3;      //도끼류
  IKBLUNT      = 4;      //둔기류
  IKSTIK       = 5;      //지팡이류
  IKBOW        = 6;      //활류    -> 공격 무기 -> 왼쪽손
  IKCLOTHS     = 7;      //상의    -> 방어 무기
  IKPANTS      = 8;      //하의
  IKSHIELD     = 9;      //방패
  IKGLOVES     = 10;     //장갑
  IKFOOTWEAR   = 11;     //신발
  IKHAT        = 12;     //투구
  IKRING       = 13;     //반지
  IKNECKLACE   = 14;     //목걸이
  IKBRACELET   = 15;     //팔찌
  IKEARCAP     = 16;     //귀걸이
  IKTATOO      = 17;     //문신    -> 방어 무기
  IKPOTION     = 18;     //포션    -> 소모품
  IKBELT       = 19;     //벨트    -> 방어무기
  IKROBE       = 20;     //로브    -> 방어무기
  IKNOITEM     = $FF;

 기본적인 아이템의 속성구분으로 활용되었다.

 

////////////////////////////////////////////////////////////////////////////////
// 아이템의 재질  TItemData.Material
////////////////////////////////////////////////////////////////////////////////

  IMATWOOD      = 0;   // 나무
  IMATBRONZE    = 1;   // 구리
  IMATSILVER    = 2;   // 은
  IMATGOLD      = 3;   // 금
  IMATCOTTON    = 4;   // 면(천)
  IMATLEATHER   = 5;   // 가죽
  IMATSILK      = 6;   // 비단(명주)

 속성구분을 위한 형태로.. 아이템의 재질을 표현했다.

정확하게 재질간의 상성관계를 두고 싶었다.

 

////////////////////////////////////////////////////////////////////////////////
// 어빌리티 행위의 종류 TAbility.Act
////////////////////////////////////////////////////////////////////////////////

  AACTNORMAL  = 0;    //일반
  AACTHIT     = 1;    //때리기
  AACTSHOOT   = 2;    //투척
  AACTMAGIC   = 3;    //마법공격

 아주 일반적인 '기술'의 기본 속성형태로..

떄리기, 투척, 마법의 3단계 형태로 구분하였다.

 

////////////////////////////////////////////////////////////////////////////////
// 어빌리티가 영향을 미치는 범위종류   TAbility.RKind
////////////////////////////////////////////////////////////////////////////////

  ARKONE      = 0;   //지정된 한 캐릭만
  ARKRANGE    = 1;   //지정된 캐릭의 주변 캐릭 모두

 어빌리티가 영향을 받는 것으로..

특정 캐릭에게만..

혹은.. 메테오 같은 경우나 확산 힐링에 사용할..

주변에 영향을 주는 경우를 고려하였다.

 

////////////////////////////////////////////////////////////////////////////////
// 어빌리티를 사용할 수 있는 무기의 계열 TAbility.Weapon
////////////////////////////////////////////////////////////////////////////////

  AWPALL        = 0;    //전체 사용가능
  AWPSHORTSWORD = 1;    //단검 계열만
  AWPSWORD      = 2;    //검 계열만
  AWPSPEAR      = 3;    //창 계열만
  AWPAXE        = 4;    //도끼 계열만
  AWPBLUNT      = 5;    //메이스등 둔기 계열만
  AWPSTICK      = 6;    //지팡이 계열만
  AWPBOW        = 7;    //활 계열만
  AWPSHIELD     = 8;    //방패 계열만
  AWPNOBOW      = 9;    //활 계열만 제외

 특정 어빌리티들이 사용 가능한 무기의 계열정보를 지정하였다.

 

////////////////////////////////////////////////////////////////////////////////
// 어빌리티의 계열 TAbility.AClass
////////////////////////////////////////////////////////////////////////////////

  ACLSNORMAL    = 0;    //일반
  ACLSFIRE      = 1;    //화염계열
  ACLSWATER     = 2;    //물,빙설계열
  ACLAIR        = 3;    //공기,전격계열
  ACLEARTH      = 4;    //대지계열
  ACLPOISON     = 5;    //독계열
  ACLDARK       = 6;    //암흑계열
  ACLCALL       = 7;    //소환계열

 마법이나 장착 아이템의 계열정보로 활용되었다.

 

////////////////////////////////////////////////////////////////////////////////
// 아이템 및 스킬 사용 시 증가되는 STATE의 종류  TAbility.Effect  TItemData.IncSTA
////////////////////////////////////////////////////////////////////////////////

  IUSTNONE        = 0;   // 아무것도 하지 않음.
  IUSTHPUP        = 1;   // HP의 증가
  IUSTMPUP        = 2;   // MP의 증가
  IUSTMAXHPUP     = 3;   // MAXHP의 증가
  IUSTMAXMPUP     = 4;   // MAXMP의 증가
  IUSTPPUP        = 5;   // PP의 증가
  IUSTSPUP        = 6;   // SP의 증가
  IUSTIPUP        = 7;   // IP의 증가
  IUSTRGNVHPUP    = 8;   // HP의 Regen 값 증가
  IUSTRENVMPUP    = 9;   // MP의 Regen 값 증가
  IUSTRGNTHPUP    = 10;  // HP의 Regen Time증가
  IUSTRGNTMPUP    = 11;  // MP의 Regen Time증가
  IUSTATTACKUP    = 12;  // 공격력 증가
  IUSTDEFENCEUP   = 13;  // 방어력 증가
  IUSTDODGEUP     = 14;  // 회피율 증가
  IUSTPRECISIONUP = 15;  // 명중률 증가
  IUSTSPEEDUP     = 16;  // 이동속도 증가
  IUSTSPEEDDOWN   = 17;  // 이동 속도 감소
  IUSTIMMOVABLE   = 18;  // 이동 불능 상태
  IUSTHPDOWN      = 19;  // HP 감소(비율)
  IUSTCONTHIT     = 20;  // 연타 공격(Continuos Hit)
  IUSTAROUSE      = 21;  // 주변 몬스터 도발
  IUSTPROXY       = 22;  // 대신 공격을 받는다.
  IUSTEXTINV      = 23;  // 인벤토리 증가 Extend Inventory;
  IUSTIGNORECAST  = 24;  // 캐스팅의 무시
  IUSTPOISON      = 25;  // 중독 시킴
  IUSTMEDIC       = 26;  // 중독을 치료함

 어빌리티에 추가 속성으로 반영될 아이템의 상태정보였다.

 

////////////////////////////////////////////////////////////////////////////////
// 어빌리티의 사용 대상 Ability Target    TAbility.Target
////////////////////////////////////////////////////////////////////////////////

  ATRGTOWN      = 0;   //자신에 대해 서용
  ATRGTENEMY    = 1;   //적에게 사용
  ATRGTALL      = 2;   //적이 아닌 모든이에게 사용
  ATRGTPARTY    = 3;   //파티원에게만 적용

 어빌리티가 주는 상대방 영향에 대한 정보

 

////////////////////////////////////////////////////////////////////////////////
// 직업의종류    TGPlayer.FJob
////////////////////////////////////////////////////////////////////////////////

  JOBASKA          = 0;   //아스카
  JOBWARRIOR       = 1;   //워리어(전사)                 - 1차 전직
  JOBROGUE         = 2;   //로그(도둑,악당,건달)
  JOBMAGICIAN      = 3;   //매지션(법사)
  JOBACOLYTE       = 4;   //어콜라이트(종자)
  JOBPALADIN       = 5;   //패러딘(성전사)               - 2차 전직
  JOBGLADIATOR     = 6;   //글라디에이터(검투사)
  JOBFANTOMFIGHTER = 7;   //팬텀화이터(싸움의화신)
  JOBASSASSIN      = 8;   //어세신(자객,암살자)
  JOBHUNTER        = 9;   //헌터(사냥꾼)
  JOBNIGHTHAWK     = 10;  //나이트호크(밤도둑)
  JOBDRUID         = 11;  //드루이드(사제,예언자)
  JOBWIZARD        = 12;  //위자드(마법사)
  JOBNECROMANCER   = 13;  //네크로맨서(무당)
  JOBSAGE          = 14;  //세이지(현자)
  JOBMONK          = 15;  //몽크(수도사)
  JOBPRIEST        = 16;  //프리스트(성직자)
  JOBMIRAGEKNIGHT  = 17;  //미라쥬나이트(신기의기사)     - 3차 전직
  JOBBERSERKER     = 18;  //베르세르카(광폭전사)
  JOBDARKKNIGHT    = 19;  //다크나이트(어둠의기사)
  JOBNIGHTSHADE    = 20;  //나이트쉐이드(밤의그림자)
  JOBARCANERANGER  = 21;  //아케인레인저(비밀의감시자)
  JOBBANDITCAPTIN  = 22;  //벤티드캡틴(밴디트가원래 발음, 산적두목)
  JOBDRUIDMASTER   = 23;  //드루이드마스터
  JOBARCMAGE       = 24;  //아크메이지(호광의마법사)
  JOBSATANICIA     = 25;  //사타나키아(악마적인사람)
  JOBTHERAPIST     = 26;  //세라피스트(치료요법사)
  JOBBENEDICT      = 27;  //베네딕투스(수도사)
  JOBHIGHPRIEST    = 28;  //하이프리스트(최고성직자)
  JOBMAX           = 29;

 미드가르드에서는 상당히 방대한 직업군을 구성하고 있었다.

3차전직까지 고려한 상태였고..

후에 5차전직까지 고려된 이름을 부여할 예정이었다.

 

////////////////////////////////////////////////////////////////////////////////
// 성별의종류 TGPlayer.FSex
////////////////////////////////////////////////////////////////////////////////

  MKMAN = 0;              //남성
  MKWOMAN = 1;            //여성
  MKSEXLESS = 2;          //중성

 정통 RPG에 따라서.. 성별에 대한 영향과 중성을 표현하려 하였다.

중성은 결혼을 못하므로.. 어빌리티를 상속할 수 있는 능력이

부여되지는 않았지만, 최상의 캐릭터로 키울 수 있었다.

설정상에는.. 나이 개념이 있어서.. 캐릭터가 늙는다..

 

////////////////////////////////////////////////////////////////////////////////
// 아이템 장착 위치  WearItem.WearPos
////////////////////////////////////////////////////////////////////////////////

  WPUNKNOWN = -1;
  WPCLOTHS = 0;             //상의
  WPHAT = 1;                //투구
  WPHEAD = 2;               //머리
  WPGLOVES = 3;             //장갑
  WPARML = 4;               //무기 좌
  WPARMR = 5;               //무기 우
  WPPANTS = 6;              //하의
  WPFOOTWEAR = 7;           //신발
  WPROBE = 8;               //망토
  WPBELT = 9;               //벨트
  WPTATOOU = 10;            //상반신문신
  WPTATOOD = 11;            //하반신 문신
  WPEARCAPL = 12;           //귀걸이 좌
  WPEARCAPR = 13;           //귀걸이 우
  WPNECKLACE = 14;          //목걸이
  WPBRACELETL = 15;         //팔찌 좌
  WPBRACELETR = 16;         //팔찌 우
  WPRINGL = 17;             //반지 좌
  WPRINGR = 18;             //반지 우
  WPRMAX  = 19;             //장착 최고값

 아이템이 장착될 위치 정보.

 

 

기술 클래스...

 

  TAbility = class(TObject)
  public
    ID           : LongWord;  //고유 ID
    JobID        : Word;      //배울수 있는 직업의 종류
    Name         : String;    //어빌리티의 이름
    EngName      : String;    //어빌리티의 이름
    IsPassive    : Boolean;   //패시브인지 아닌지 여부
    Act          : Byte;      //어빌리티 행위(위표 참조)
    RKind        : Byte;      //어빌리티가 영향을 미치는 범위종류(지정캐릭, 주변캐릭)
    Range        : Integer;   //주변캐릭터에 영향을 미칠경우 범위
    AffectNum    : Word;      //적용받는 캐릭의 제한 개수
    Weapon       : Byte;      //해당 능력을 사용할 수 있는 무기종류(위표참조)
    AP           : Integer;   //어빌리티의 공격력
    UseMP        : Integer;   //사용시 사용되는 마나 포인트
    AClass       : Byte;      //어빌리티의계열(일반,화염,얼음,전격,대지)
    Effect       : Word;      //사용시 증가되는 스텟의 종류
    ContTime     : LongWord;  //지속되는 시간
    AUnit        : Byte;      //능력치의 단위(%, 값, 백분율등)(Ability Unit)
    EVAL         : Integer;   //사용시 증가되는 스텟의 값
    CastTime     : LongWord;  //발동하기 위해 필요한 시간
    ActTime      : LongWord;  //시전하는 동안의 시간
    DelayTime    : LongWord;  //다음 사용 때까지 지연 되는 시간
    Target       : Byte;      //어빌리티 사용 대상
    UseEP        : Integer;   //배울 때 사용되는 에테르 포인트
    RLevel       : Word;      //배울 때 요구되는 사용자의 레벨
    Distance     : Integer;   //어빌리티 사용 사정거리
    BMapName     : String;    //이미지 파일 이름
    Description  : String;    //어빌리티에 대한 설명
    EDescription : String;    //어빌리티에 대한 설명

 

 

 

History

Last edited on 05/01/2007 18:01 by 꿈꾸는자

Comments (0)

You must log in to leave a comment. Please sign in.