unit Grobal2; //ȫ(Ϳͻͨ)Ϣʶ,,ݽṹ, 


interface
uses
   Math,windows;
Const
  BUFFERSIZE    =1024;  //嶨

  //ͻ˷͵
  CM_SOFTCLOSE  =0;   //˳(Ϸ,Ϸд,Ҳʱѡʱ˳)

 

  //¼йص //CM: client msg,ЩϢǿͻ͵
  CM_IDPASSWORD  =1; //ͻID
  CM_QUERYUSERSTATE=2; //ѯû״̬(û¼ȥ,ʵǿͻȡѯһ
˳ǰ״̬Ĺ,ԶûһϷһЩϢصͻ)
  CM_ADDNEWUSER =3; //½û,ע˺,¼ʱѡ"û"ɹ
  CM_UPDATEUSER =4; //ע??
  CM_SELECTSERVER =5; //ѡ,עⲻѡ,ʢһ(8??group.datôд)
  //ֹһķ
  CM_CHANGEPASSWORD =6; //޸
  CM_NEWCHR =7; //½ɫ,עⲻ˵½û
  CM_QUERYCHR =8; //¼ɹ,ͻԳҽɫһ˲
  CM_DELCHR =9; //ɾɫ
  CM_SELCHR =10; //ѡɫʼϷ
  CM_QUERYUSERNAME=11; //Ϸ,ؽɫͻ

  CM_SAY =22; //ɫ

  //ͻ˽

  CM_MAGICKEYCHANGE = 30; //ħݼı
  CM_CREATEGROUP =42; //½
  CM_WANTMINIMAP =43; //û"Сͼ"ť
  CM_OPENGUILDDLG =45; //û"л"ť
  CM_GROUPMODE=41; //黹ǿ
  CM_ADDGROUPMEMBER =51; //
  CM_DELGROUPMEMBER =52; //ɾ

  CM_SPEEDHACKUSER =59; //û׼
  CM_ADJUST_BONUS =60; //ûõ??˽бȽ,СʱóǮ,Ǻȷ,
  //󾭹Եĸֵ֤

  CM_QUERYBAGITEMS=62; //ѯƷ
  CM_LOGINNOTICEOK = 63; //ϷҸȷʵ,Ϸ


  //1(14ֻ)
  CM_TURN       =4001; //ת(ı)
  CM_WALK       =4002; //
  CM_SITDOWN    =4003; //
  CM_RUN        =4004; //
  CM_HIT        =4005; //ͨ
  CM_POWERHIT   =4008; //ɱ
  CM_LONGHIT    =4009; //ɱ
  CM_WIDEHIT    =4010; //
  CM_HEAVYHIT   =4011; //Ķ
  CM_BIGHIT     =4012; //??
  CM_THROW      =4013; //׷
  CM_FIREHIT    =4014; //һ𹥻
  CM_SPELL      =4015; //ʩħ

  CM_CLICKNPC   =3015; //ûĳNPCн

  //2
  CM_OPENDOOR   =2001; //,ߵͼĳŵʱ
  CM_DROPITEM =2010; //ӰӳƷͼ,ʱڰȫܻʾȫӶ
  CM_PICKUP =2011; //
  CM_TAKEONITEM =2021; //װװϵװλ
  CM_TAKEOFFITEM = 2022; //ĳװλȡĳװ
  CM_EAT =2023; //ҩ
  CM_BUTCH =2024; //54Ұ?

  //̵NPC

  CM_MERCHANTDLGSELECT =2030; //Ʒѡ,
  CM_MERCHANTQUERYSELLPRICE =2031; //ؼ۸,׼۸,̵֪ûЩ־û
  //ϵͳԶӼ
  CM_MERCHANTQUERYREPAIRCOST =2032; //ͻNPCȡ

  CM_USERSELLITEM =2040; //û
  CM_USERREPAIRITEM =2041; //û
  CM_USERSTORAGEITEM =2042; //ûĴ涫
  CM_USERGETDETAILITEM =2043; //ȡƷ嵥,"۽ָ",һ۽ָѡ
  CM_USERBUYITEM =2044; //û붫
  CM_USERTAKEBACKSTORAGEITEM =2045; //û򱣹Աȡض
  CM_USERMAKEDRUGITEM =2046; //û춾ҩ(Ʒ)
  CM_DROPGOLD =2050; //û½Ǯ

  CM_DEALTRY =2060; //ʼ,׿ʼ
  CM_DEALCANCEL =2061; //ȡ
  CM_DEALADDITEM =2062; //ӶƷ
  CM_DEALDELITEM =2063; //ӽƷϳض???Ŷ
  CM_DEALCHGGOLD =2064; //ϽǮΪ0,,нǮ,˫Ϣ
  CM_DEALEND =2069; //׳ɹ,ɽ

  CM_GUILDHOME =2070; //"лҳ"
  CM_GUILDMEMBERLIST =2071; //"Աб"
  CM_GUILDADDMEMBER =2072; //ӳԱ
  CM_GUILDDELMEMBER =2073; //˳л
  CM_GUILDUPDATENOTICE =2074; //޸лṫ
  CM_GUILDUPDATERANKINFO =2075; //Ϣ(ȡ)

  //װĿ
  U_WEAPON      =0;    //
  U_RIGHTHAND   =1;    //
  U_DRESS       =2;    //·
  U_HELMET      =3;    //ͷ
  U_NECKLACE    =4;    //
  U_ARMRINGR    =5;    //ָֽ
  U_ARMRINGL    =6;    //ָֽ
  U_RINGR       =7;    //ҽָ
  U_RINGL       =8;    //ָ

  //˷͵ sm:server msg,ͻ˷͵Ϣ

  //¼ʺš½ɫѯɫ
  SM_NEWID_SUCCESS =101; //˺ųɹ
  SM_NEWID_FAIL =102; //..ʧ
  SM_PASSWD_FAIL =103; //֤ʧ,"֤ʧ,Ҫµ¼"??
  SM_NEEDUPDATE_ACCOUNT =104; //Ҫ,עIDᷢʲô仯?
  //˽еͨIDֵ??ͨIDΪԱID,GM?
  SM_UPDATEID_SUCCESS =105; //³ɹ
  SM_UPDATEID_FAIL =106; //ʧ
  SM_PASSOK_SELECTSERVER = 107; //֤ȷ,ʼѡ
  SM_SELECTSERVER_OK =109; //ѡɹ
  SM_QUERYCHR =111; //ؽɫϢͻ
  SM_QUERYCHR_FAIL =112; //ؽɫϢͻʧ
  SM_NEWCHR_SUCCESS  =113; //½ɫɹ
  SM_NEWCHR_FAIL =114; //..ʧ
  SM_CHGPASSWD_SUCCESS =115; //޸ɹ
  SM_CHGPASSWD_FAIL =116; //..ʧ
  SM_DELCHR_SUCCESS =117; //ɾɫɹ
  SM_DELCHR_FAIL =118; //..ʧ
  SM_STARTPLAY=119; //ʼϷ(˽ϷҸϷ)
  SM_STARTFAIL =120; //ʼʧ,洫,ʱѡɫ,㿪ʼ㽡ϷҸ

  SM_VERSION_FAIL =121; //ͻ˰汾֤ʧ
  SM_OUTOFCONNECTION =122; //,ǿû
  SM_RECONNECT =125; // 
  SM_SENDNOTICE =202; //ͽϷҸ

  SM_MYSTATUS =131; //ҵ״̬,һ״̬,Ƿ񱻶,˾ǿƻس
  SM_TIMECHECK_MSG = 227; //ʱӼ,ͻ

  SM_CHANGEMAP   =201; //ͼı,µͼ
  SM_AREASTATE = 228; //Χ״̬
  SM_NEWMAP =223; //µͼ??
  SM_MAPDESCRIPTION = 229; //ͼ,лսͼ??ȫ?һmapinfo.txt,֪ûϵ
  //desc:Ӣд
  SM_LOGON =224; //logon

  SM_CHANGELIGHT =240; //ظı
  SM_LAMPCHANGEDURA=241; //־øı
  SM_LIGHTING =242; //

  SM_OPENDOOR_OK=249; //ͨŵɹ
  SM_OPENDOOR_LOCK=250; //ֹŵǷ,ǰʢͨȥµҪ5ӿһ
  SM_CLOSEDOOR =251; //û,йر

  SM_DEATH=260; //
  SM_NOWDEATH =261; //ɱ?
  SM_SKELETON=262; //ʬ
  SM_ALIVE =263; //??ָ
  SM_ABILITY =264; //ԶԻ,F11
  SM_SUBABILITY=265; //ԶԻ
  SM_DAYCHANGING=266; //½ǵ̫
  SM_WINEXP =267; //þ
  SM_LEVELUP =268; //,Ͻǳī̵
  SM_HEALTHSPELLCHANGED =269; //hp,,mpı
  SM_ADJUST_BONUS =280;

  SM_STRUCK =310; //ܹ
  SM_CHANGEFACE=311; //,͸ı? 
  SM_OPENHEALTH=312; //Ѫʾ(ͷϵһ)
  SM_CLOSEHEALTH =313; //رѪʾ
  SM_INSTANCEHEALGUAGE=314; //ʵʱ
  SM_BREAKWEAPON=315; //

  //ԻϢ
  SM_CRY=316; //
  SM_GROUPMESSAGE =347; //!!
  SM_GUILDMESSAGE =348; //л!~
  SM_WHISPER=349; //˽
  SM_HEAR=351; //˻Ļ
  SM_SYSMESSAGE=390; //ϵͳϢ,ʢһ,˽

  SM_USERNAME =352; //
  SM_CHANGENAMECOLOR=353; //ɫı,,,,

  
  //ƶ
  SM_TURN       =1001;
  SM_WALK       =1002;
  SM_SITDOWN    =1003;
  SM_RUN        =1004;
  SM_HIT        =1005;
  SM_POWERHIT   =1008;
  SM_LONGHIT    =1009;
  SM_WIDEHIT    =1010;
  SM_HEAVYHIT   =1011;
  SM_BIGHIT     =1012;
  SM_THROW      =1013;
  SM_FIREHIT    =1014;
  SM_SPELL      =1015;
  SM_BACKSTEP   =1021; //,ҰЧ? //ͳ칫ֹҵĺ??axemon.pasprocedure  TDualAxeOma.Run
  SM_RUSH       =1022; //ܶиı䷽
  SM_RUSHKUNG   =1023; //??

  SM_SPACEMOVE_HIDE =1041; //ʿһ(忴ԴActor.pasprocedure TActor.ProcMsg) 
  SM_SPACEMOVE_HIDE2=1042; //
  SM_SPACEMOVE_SHOW =1043; //ʿһΪ
  SM_SPACEMOVE_SHOW2=1044; 
  SM_MOVEFAIL       =1045; //ƶʧ,߶ܶ
  SM_BUTCH          =1046; //Ұ?

  SM_FLYAXE         =1060; //ɸ,ͳĹʽ?

  SM_MAGICFIRE      =1072; //,ǽ??
  SM_MAGICFIRE_FAIL = 1073;

  SM_HIDE =1224; //?
  SM_GHOST=1225; //ʬ,ħЧ?
  SM_DISAPPEAR=1226; //Ʒʧ
  SM_DIGUP=1227; //һ""һ"",ڶ""
  SM_DIGDOWN=1228; //ڶ""
  SM_SHOWEVENT =1229; //ʾ¼
  SM_HIDEEVENT = 1230; //¼

  SM_ADDITEM=2040; //
  SM_BAGITEMS =2041;
  SM_UPDATEITEM=2042; //
  SM_DELITEM =2043;
  SM_DELITEMS=2044;
  SM_DROPITEM_SUCCESS=2045;
  SM_DROPITEM_FAIL=2046;
  SM_ITEMSHOW=2047;
  SM_ITEMHIDE=2048;


  SM_TAKEON_OK=2052;
  SM_TAKEON_FAIL=2053;
  SM_TAKEOFF_OK=2054;
  SM_TAKEOFF_FAIL=2055;
  SM_EXCHGTAKEON_OK=2056;
  SM_EXCHGTAKEON_FAIL=2057;

  SM_SENDUSEITEMS=2058;
  SM_WEIGHTCHANGED=2059;
  SM_GOLDCHANGED=2060;
  SM_FEATURECHANGED=2061;
  SM_CHARSTATUSCHANGED=2062; 
  SM_CLEAROBJECTS=2063;
  SM_EAT_OK=2064;
  SM_EAT_FAIL=2065;
  SM_ADDMAGIC=2066;
  SM_SENDMYMAGIC=2067;
  SM_DELMAGIC=2068;
  SM_MAGIC_LVEXP=2069;
  SM_DURACHANGE=2070;
  SM_MERCHANTSAY=2071;
  SM_MERCHANTDLGCLOSE=2072;

  SM_SENDGOODSLIST=2073;
  SM_SENDUSERMAKEDRUGITEMLIST=2074;
  SM_SENDUSERSELL=2075;
  SM_SENDUSERREPAIR=2076;
  SM_SENDBUYPRICE=2077;
  SM_USERSELLITEM_OK=2078;
  SM_USERSELLITEM_FAIL=2079;
  SM_SENDREPAIRCOST=2080;
  SM_USERREPAIRITEM_OK=2081;
  SM_USERREPAIRITEM_FAIL=2082;
  SM_STORAGE_OK=2083;
  SM_STORAGE_FULL=2084;
  SM_STORAGE_FAIL=2085;
  SM_SAVEITEMLIST=2086;

  SM_TAKEBACKSTORAGEITEM_OK=2087;
  SM_TAKEBACKSTORAGEITEM_FAIL=2088;
  SM_TAKEBACKSTORAGEITEM_FULLBAG=2089;

  SM_BUYITEM_SUCCESS=2090;
  SM_BUYITEM_FAIL=2091;

  SM_MAKEDRUG_SUCCESS=2092;
  SM_MAKEDRUG_FAIL=2093;

  SM_SENDDETAILGOODSLIST=2094;
  SM_TEST=2095;
  SM_GROUPMODECHANGED=2096;
  SM_CREATEGROUP_OK=2097;
  SM_CREATEGROUP_FAIL=2098;
  SM_GROUPADDMEM_OK=2099;
  SM_GROUPADDMEM_FAIL=2100;
  SM_GROUPDELMEM_OK=2101;
  SM_GROUPDELMEM_FAIL=2102;
  SM_GROUPCANCEL=2103;
  SM_GROUPMEMBERS=2104;

  SM_OPENGUILDDLG=2105;
  SM_SENDGUILDMEMBERLIST=2106;
  SM_OPENGUILDDLG_FAIL=2107;
  SM_CHANGEGUILDNAME=2124;
  SM_GUILDADDMEMBER_OK=2126;
  SM_GUILDADDMEMBER_FAIL=2127;
  SM_GUILDDELMEMBER_OK=2128;
  SM_GUILDDELMEMBER_FAIL=2129;
  SM_GUILDRANKUPDATE_FAIL=2130;
  SM_GUILDMAKEALLY_OK=2131;
  SM_GUILDMAKEALLY_FAIL=2132;
  SM_GUILDBREAKALLY_OK=2133;
  SM_GUILDBREAKALLY_FAIL=2134;

  SM_DEALTRY_FAIL=2108;
  SM_DEALMENU=2109;
  SM_DEALCANCEL=2110;
  SM_DEALADDITEM_OK=2111;
  SM_DEALADDITEM_FAIL=2112;
  SM_DEALDELITEM_OK=2113;
  SM_DEALDELITEM_FAIL=2114;
  SM_DEALREMOTEADDITEM=2115;
  SM_DEALREMOTEDELITEM=2116;
  SM_DEALCHGGOLD_OK=2117;
  SM_DEALCHGGOLD_FAIL=2118;
  SM_DEALREMOTECHGGOLD=2119;
  SM_DEALSUCCESS=2120;

  SM_SENDUSERSTORAGEITEM=2121;

  SM_READMINIMAP_OK=2122;
  SM_READMINIMAP_FAIL=2123;

  SM_SENDUSERSTATE=2125;

  SM_BUILDGUILD_OK=2135;
  SM_BUILDGUILD_FAIL=2136;
  SM_MENU_OK=2137;
  SM_DLGMSG=2138;
  SM_DONATE_OK=2139;
  SM_DONATE_FAIL=2140;

  SM_ACTION_MIN=2200;
  SM_ACTION_MAX=2499;
  SM_ACTION2_MIN=2500;
  SM_ACTION2_MAX=2999;

  RCC_MERCHANT  =1;
  RCC_GUARD     =2;

  VERSION_NUMBER_0522=522;

  DEFBLOCKSIZE =16;

  UNITX = 48;
  UNITY = 32;
  LOGICALMAPUNIT =20;
  HALFX = 24;
  HALFY = 16;

  ET_DIGOUTZOMBI =0;
  ET_PILESTONES = 1;
  ET_HOLYCURTAIN = 2;
  ET_FIRE= 3;
  ET_SCULPEICE = 4;

  STATE_STONE_MODE =0; //ʯ
  STATE_OPENHEATH = 1; //

  MAXBAGITEM = 52; //ո 5*8=40,10,6
  //ֻ8,Ǵ,ƶ,ӥ16
  DR_UP=0; //
  DR_UPRIGHT =1; //
  DR_RIGHT =2; //
  DR_DOWNRIGHT =3; //
  DR_DOWN =4; //
  DR_DOWNLEFT =5; //
  DR_LEFT =6; //
  DR_UPLEFT =7; //

type

  TDefaultMessage=packed record  //Size=12
    Ident :word;
    Recog :integer;  //ʶ
    Param :smallint;
    Tag   :smallint;
    Series:smallint;
  end;
  //Ident=SM_DAYCHANGING
  //   Param=DayBright
  //   Tag=Ũȣ0123

  TUserInfo=Record
     Name:String[32];
     Looks:integer;
     StdMode:Integer;
     Shape:Integer;
  end;

  TStdItem=record
     Name:String[16];   //Ʒ
     Looks:integer;     //ۣItems.WILеͼƬ
     StdMode:integer;   //0/1/2/3ҩ 5/6:10/11ף15ͷ22/23ָ24/2619/20/21
     Shape:integer;
     AC:Integer;
     MAC:integer;
     Weight:integer;
     DuraMax:integer; //־
     NeedIdentify:byte; //Ҫ
     DC,MC,SC:Integer;
     Source:integer;
     Need:integer;
     NeedLevel:integer;
  end;

  PTClientItem=^TClientItem;
  TClientItem=Record
     s:TStdItem;
     MakeIndex:Integer;
     Dura:Integer;
     DuraMax:Integer;
  end;

  TAbility= packed record
     MP,MaxMP:Integer;
     HP,MaxHP:integer;
     Exp,MaxExp:Integer;
     Level:Integer;
     Weight,MaxWeight:Integer;
     WearWeight,MaxWearWeight:Integer;
     HandWeight,MaxHandWeight:Integer;
     AC:Integer;
     MAC:Integer;
     DC:Integer;
     MC,SC:Integer;
  end;

  PTChrMsg=^TChrMsg;
  TChrMsg=Record
     Ident:integer;
     Dir:Integer;
     X,Y:Integer;
     State:integer;
     feature:integer;
     saying:string;
     Sound:integer;
  end;

  TUserStateInfo=Record
     UserName:String[32];
     GuildName:String[32];
     GuildRankName:String[32];
     NameColor:Integer;
     Feature:integer;
     UseItems:Array[0..127] of TClientItem;
  end;

  TUserCharacterInfo=Record
     Name:String;
     Job:byte;
     Hair:smallint;
     level:Integer;
     Sex:byte;
  end;

  TUserEntryInfo=Record //עIDʱ洢ύõݽṹ
     LoginId:String[16]; //û
     Password:String[16];
     UserName:String[32];
     SSNo:String[18];
     Quiz:String[32];
     Answer:String[32];
     Phone:String[15];
     EMail:String[64];
     
  end;

  TUserEntryAddInfo=Record //עIDʱݽṹ()
     Quiz2:String[32];
     Answer2:String[32];
     MobilePhone:String[15];
     BirthDay:String[16];
  end;

  PTDropItem=^TDropItem; //ϷƷ,,,stditem.wilе
  TDropItem=record
     Id:Integer; //Ʒ
     X,Y:Integer; //
     Looks:integer; //stditem.wilе
     FlashTime:LongInt; //Ʒڵֵʱ(˸ʱ)
     Name:String[16]; //Ʒ
     BoFlash:Boolean; //
     FlashStepTime:LongInt; 
     FlashStep:Integer;
  end;

  TDef=Record
    Spell:integer;
    DefSpell:integer;
    EffectType:Integer;
    MagicId:Integer;
    Effect:Integer;
    DelayTime:Integer;
    MagicName:String[16];
    MaxTrain:Array [0..255] of integer;
  end;

  PTClientMagic=^TClientMagic;
  TClientMagic=Record
     Key:Char;
     Def:TDef;
     Level:Integer;
     CurTrain:Integer;
  end;

  TNakedAbility=Record
//naked adj., ڸǵ, װε, ޱ, []֤ݵ, δ֤ʵ
     DC,MC,SC,AC,MAC:Integer;
     HP,MP:Integer;
     Hit:integer;
     Speed:integer;
  end;

  TShortMessage=Record
     Ident:Integer;
  end;

  TMessageBodyW=Record
     Param1:integer;
     Param2:integer;
     Tag1:integer;
     Tag2:integer;
  end;

  TCharDesc=Record 
     Feature:Integer;
     Status:Integer;
  end;

  TMessageBodyWL=Record
     lParam1,lParam2:longint;
     lTag1,lTag2:longint;
  end;

  PTClientGoods=^TClientGoods;
  TClientGoods=record
     Name:string[16];
     SubMenu:Integer;
     Price:Integer;
     Stock:integer;
     Grade:integer;
  end;

function  MakeDefaultMsg (msg:smallint; Recog:integer; param, tag, series:smallint):TDefaultMessage; //ϳϢ
//wpeصļܵܽṹ
function  UpInt(i:double):integer;
Function  RACEfeature(Feature:word):smallint; //featureórace,race:,,mir2͹ķ߼,,actor.pasһ-巵ض function RaceByPM (race: integer): PTMonsterAction;  ɼķ붯ҹ,,ֱӹϵ
Function  HAIRfeature(Feature:word):byte; //featureóͷ
Function  DRESSfeature(Feature:word):byte; //featureó·
Function  APPRfeature(Feature:word):byte; 
Function  WEAPONfeature(Feature:word):byte; 
function  MakeFeature(Race:Word;Appr,Hair,Dress,Weapon:byte):Integer; //ϳfeature:òһ(,,ǵ), ò, ɫ, д
implementation

function  MakeDefaultMsg (msg:smallint; Recog:integer; param, tag, series:smallint):TDefaultMessage;
begin
    result.Ident:=Msg;
    result.Param:=Param;
    result.Tag:=Tag;
    result.Series:=Series;
    result.Recog:=Recog;
end;

function  UpInt(i:double):integer;
begin
  result:=Ceil(i); //
end;

//FeatureԵķֽͺϳɣ32λ16λΪRaceAppr,
//   16λУλʾHair,6λʾDress,6λʾWeapon
//   Race=0ʱ,Dress mod 2 ʾԱ
//   Race=0ʱҲŮеӦżŮ
//*******FeatureĽͿԼ壬Raceȡֵ0..90Appr:0..9
//*******Hair6ַͣ3600ͼƬÿ600ͼƬһַͣŮ3
//*******DressHum.WILбʾжͼƬжַװHum.WILչ
//*******WeaponWeapon.WILͼƬͬģÿ600ӦһApprŮ
//*********40800Ӧ68Ůϼƣ
Function  RACEfeature(Feature:word):smallint;
begin
  result:=Hiword(Feature) div 10;
end;

Function  HAIRfeature(Feature:word):byte;
begin
  result:=(LoWord(Feature) and $F000) shr 12 ;  //1111000000000000
end;

Function  DRESSfeature(Feature:word):byte;
begin
  result:=(LoWord(Feature) and $3F00) shr 7;    //0000111111000000
end;

Function  WEAPONfeature(Feature:word):byte;
begin
  result:=LoWord(Feature) and $3F;              //0000000000111111
end;

Function  APPRfeature(Feature:word):byte;
begin
  result:=hiword(Feature) mod 10;
end;

function  MakeFeature(Race:Word;Appr,Hair,Dress,Weapon:byte):Integer;
begin
  result:=MakeLong(((Hair And $0F)shl 12) + ((Dress And $3F) shl 6) + (Weapon And $3F) ,Race*10+Appr);
end;

end.
