石器时代8.0封包全解析日文原版

2019-02-22 10:45:41 石器技术 石器时代TV

石器时代8.0封包全解析

clienttoserver W( int x, int y, string direction);

(Walk)歩く。向きをかえる。クライアントはユーザーが指定した経路を計算し, その歩きの経路を送信する。クライアントは既に受けたマップデータなどにより 当たり判定などを行うが,これはサーバーと既に完全一致していることが前提と なる。サーバーはこのWによる応答はしない。サーバーはクライアントから受け 取った座標を元に歩く処理を行うが,それは他ユーザーに見えるための処理など を行う為だけに行う。 また,サーバーは1歩キャラが歩く毎にMCを送信する。また,クライアントはMC にてチェックサムが違えばマップをサーバーに要求しないといけないが,その際 歩いている状態などでは歩きの再計算が必要になるかもしれない。 

  • int x,y

  • 歩き始めのプレイヤーのフロア,x,y座標。

  • string direction

  • あるく方向 a,b,c,d,e,f,g,hが場所が変化する移動で、 aが真上(dx,dy)=(0,-1)で、みぎまわりに hが左上(-1,-1) A,B,C,D,E,F,G,H がその場回転。向きはそれぞれ真上か らみぎまわり。右右上下とあるく場合は "ccae"という 文字列を送信し、その場で左に向くばあいは"G"と送信 することになる。かならず1歩1文字に対応している。こ の文字列はエスケープしない。





void old_lssproto_FC_send( int fd )  {  	lssproto_CreateHeader( lssproto.work , "FC" );  	lssproto_strcatsafe( lssproto.work , "" ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
void old_lssproto_W_send( int fd,int x,int y,char* direction )  {  	lssproto_CreateHeader( lssproto.work , "W" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( direction ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver w( int x, int y, string direction);
    基本的にはWと全く同じ。クライアントが,その1回のログイン(起動?)の内に, 既にマップを読んでいたら(もしくは,歩いてMCが来て,チェックがOKだった)場合, もうMCは必要ないので,歩く時にMC要らない要求をだしながら歩くのがこのwプロトコルである。 このwを送信する条件として,次に出現するマップのイベントオブジェクトが CHAR_EVENT_ALTERRATIVE だった場合には,このイベントオブジェクトが変化している可能性があるので普通のW,又はその部分をマップ要求して歩く事。 



    void old_lssproto_w_send( int fd,int x,int y,char* direction )  {  	lssproto_CreateHeader( lssproto.work , "w" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( direction ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver EV( int event,int seqno,int x, int y, int dir);
    クライアントがイベントオブジェクトを踏んだ時に発生する。 ワープや固定敵へのエンカウント等に使用される。 





    void old_lssproto_EV_send( int fd,int event,int seqno,int x,int y,int dir )  {  	lssproto_CreateHeader( lssproto.work , "EV" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( event ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( seqno ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dir ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int event

    • イベントの種類。char_base.hでは以下のように定義されている。

      typedef enum  {  	CHAR_EVENT_NONE,		イベントは発生しない  	CHAR_EVENT_NPC,			固定NPCである  	CHAR_EVENT_ENEMY,		固定敵エンカウントイベント  	CHAR_EVENT_WARP,		ワープイベント  	CHAR_EVENT_ALTERRATIVE,		何も無いが,変化するかもしれないもの。(マップ読込時に要求する事)  	CHAR_EVENTNUM,  }

      CHAR_EVENT; CHAR_EVENT_NPCの場合は,単なるNPCで,しかもぶつかって欲しいものなど。 クライアントはEVを送らず,ぶつかったかを判断して手前で止まるようにする事。

    • int seqno

    • イベントにシーケンスNoを打っておく。イベントが起こる度にインクリメントしていく事。 これはクライアントが管理する。 サーバーのEVの応答に対して使う。整合性を取るため。

    • int x,y

    • 自分の位置

    • int dir

    • イベントのある向き。自分自身の位置とこの向きからイベントの場所を探す。自分自身と同じ場所の時は-1。

  • clienttoserver EN( int x, int y );
    クライアントが(固定じゃない)敵とエンカウントしたい時に送信する。 仲間歩きの時のリーダーじゃない人はこれを送信しないようにする事。 





    void old_lssproto_EN_send( int fd,int x,int y )  {  	lssproto_CreateHeader( lssproto.work , "EN" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • エンカウントしたプレイヤーのフロア,x,y座標。

  • clienttoserver DU( int x, int y);
    クライアントがプレイヤー同士のエンカウントを要求した場合に送信する。 仲間歩きの時のリーダーじゃない人はこれを送信しないようにする事。 





    void old_lssproto_DU_send( int fd,int x,int y )  {  	lssproto_CreateHeader( lssproto.work , "DU" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • エンカウントしたプレイヤーのフロア,x,y座標。

  • clienttoserver EO( int dummy );
    クライアントが最後のムービーを見終わったときに送る。



    void old_lssproto_EO_send( int fd,int dummy )  {  	lssproto_CreateHeader( lssproto.work , "EO" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dummy ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int dummy

    • ダミーデータ。今は何でも良い。

  • clienttoserver BU( int dummy );
    クライアントがエンカウントを中断したい場合に送る。



    void old_lssproto_BU_send( int fd,int dummy )  {  	lssproto_CreateHeader( lssproto.work , "BU" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dummy ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int dummy

    • ダミーデータ。今は何でも良い。

  • clienttoserver JB( int x, int y );
    他の戦闘に参戦したい場合に送る。失敗、成功は EN で送り返す。



    void old_lssproto_JB_send( int fd,int x,int y )  {  	lssproto_CreateHeader( lssproto.work , "JB" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x, int y;

    • クライアントの現在の座標。

  • clienttoserver LB( int x, int y );
    他の戦闘を観戦したい場合に送る。失敗、成功は EN で送り返す。



    void old_lssproto_LB_send( int fd,int x,int y )  {  	lssproto_CreateHeader( lssproto.work , "LB" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x, int y;

    • クライアントの現在の座標。

  • clienttoserver B( string command );
    クライアントからプレイヤーの戦闘時コマンドを指定する。ここで相手番号とは0~19で指定すると個人を指し、20だと右側サイド全体を指定。21だと左側サイド全体。22だとフィールド全体を指す。




    void old_lssproto_B_send( int fd,char* command )  {  	lssproto_CreateHeader( lssproto.work , "B" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( command ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • H|相手番号(%X)(0~19)
      通常攻撃。相手の番号を指定

    • E
      逃げる。

    • G
      防御。

    • N
      何もしない。

    • T|相手番号(%X)
      捕獲。

    • J|呪術の番号(%X)|相手番号(%X)。 
      呪術を使う。ここで呪術の番号とはプレイヤーの呪術枠の番号を指す。 よって(0~5)。

    • W|ペット技番号(%X)|相手番号(%X)
      ペット技を使用する。ここでのペット技番号はペットの技枠の番号。 よって(0~7)

    • S|ペットの番号(%d)。
      ペット出す。負の数ならペット戻す。

    • I|アイテムの番号(%X)|相手番号(%X)。 
      アイテムを使う。ここでアイテムの番号とはプレイヤーのアイテム枠の番号を指す。 よって(5~19)。

  • clienttoserver SKD( int dir , int index );
    (SKillDir) 指定した方向にスキルをつかう。 

    スキル表は以下の通りである。これはサーバのソースの一部分である。

        ソースファイルではコメント      rpcgen Cのコメントそのままするから。コンパイル通らんくなる。      コメントスキル一覧enum        みぎの名前は適当。とりあえず、意味がわかるていど      typedef enum      {      SKILL_FIRE,      SKILL_MAGICIAN,         魔法使い      SKILL_PRIEST,           僧侶      SKILL_ALOTOFTHINGS,     ものもち                              求め方は、                             7(装備) + 8 (初期 ) + 4*(スキルのレベル)      SKILL_AVOIDRATEUP,      みかわしのじゅつ 3% ずつあがる      SKILL_DETERMINEITEM,    アイテム識別        SKILL_DETERMINOTHERS,   千里眼                             0 当り判定の白黒(地形)                             1 地形が色つきで見える。パーツが入れな                                 かったら黒で、入れたらタイルの色                             2 プレイヤー                             3 NPC                             4 アイテム                             5 敵        SKILL_FIRECUT,         炎削減  5 %      SKILL_THUNDERCUT,      稲妻削減  5 %      SKILL_ICECUT,          氷削減  5 %      SKILL_MERCHANT,        商人 売り20% 買い100% から 5%ずつあがる      SKILL_HEALER,          僧侶                              パラメータ回復を順番に上にいくほど下を含む                              1 毒                              2 しびれ                              3 沈黙                              4 石化                              5 暗闇                              6 混乱                              7 HP 1 で復活                              8 HP まんたんで復活      武器関係全部      命中率をどれだけいかせるか      0  0      1 50      2 57      3 64      4 71      5 78      6 85      7 92      8 100      クリティカルアップ( 100 でわる )初期値はほぼ 1 10 までいく      これは + でいいかな      0 0      1 1      2 2      3 3      4 4      5 5      6 6      7 7      8 8        SKILL_FIST,             素手装備      SKILL_SWORD,            剣装備      SKILL_AXE,              斧装備      SKILL_SPEAR,            槍装備      SKILL_BOW,              弓装備      SKILL_CANE,             杖装備        SKILL_LARGEVOICE,       大きな声   Lv 8                              詳しいことはプロトコル TK を      SKILL_NUM      }

    SKILL_ID; 



    void old_lssproto_SKD_send( int fd,int dir,int index )  {  	lssproto_CreateHeader( lssproto.work , "SKD" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dir ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( index ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int dir

    • スキルを使う方向

    • int index

    • 自分の持っているスキルの表へのindex.

  • clienttoserver ID( int x, int y, int haveitemindex,int toindex);
    (useItemDir)アイテムを使う。ほぼフィールド上からしか呼ばれない。バトル中は別プロトコルにてアイテム使用の プロトコルが飛んでくる。



    void old_lssproto_ID_send( int fd,int x,int y,int haveitemindex,int toindex )  {  	lssproto_CreateHeader( lssproto.work , "ID" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( haveitemindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( toindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • 自分のx,y 座標

    • int haveitemindex

    • どのアイテムを使ったか。アイテムの場所を送る。

    • int toindex

    • 誰にアイテムを使用したか。これはオブジェクトやキャラのindexではない。以下の様になっている。

      	  自分    = 0  	  ペット  = 1 ~5  	  仲間    = 6 ~10 (S N の0~4に対応。自分自身も含まれている)

      対象が全員,とか分からない,とかの場合は-1で送信する。

  • clienttoserver PI( int x, int y,int dir );
    (PickupItem) アイテムを拾う。拾うのは足元をふくむ隣接する9マスである。




    void old_lssproto_PI_send( int fd,int x,int y,int dir )  {  	lssproto_CreateHeader( lssproto.work , "PI" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dir ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • 自分のx,y 座標

    • int dir

    • 拾う方向。その方向と、足元を見る。 負の時は足元だけ見る。

  • clienttoserver DI( int x, int y, int itemindex);
    (DropItem) アイテムを置く。置くのはドロップボタンに置くので、方向や位置の 指定はない。itemindexのアイテムを置く。いつでも自分の前に置く。 




    void old_lssproto_DI_send( int fd,int x,int y,int itemindex )  {  	lssproto_CreateHeader( lssproto.work , "DI" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( itemindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • 自分のx,y 座標

    • int itemindex

    • 置きたいアイテムのインデクス。

  • clienttoserver DG( int x, int y, int amount );
    (DropGold) お金を置く。SA用に現在位置の座標を追加。




    void old_lssproto_DG_send( int fd,int x,int y,int amount )  {  	lssproto_CreateHeader( lssproto.work , "DG" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( amount ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • 自分のx,y 座標

    • int amount

    • 置くお金の量。

  • clienttoserver DP( int x, int y,int petindex);
    (DropPet) ペットを置く。方向や位置の指定はない。 petindexのアイテムを置く。いつでも自分の前に置く。 




    void old_lssproto_DP_send( int fd,int x,int y,int petindex )  {  	lssproto_CreateHeader( lssproto.work , "DP" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( petindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • 自分のx,y 座標

    • int petindex

    • 置きたいペットのindex。プレイヤーが何番目に持っているペットか。

  • clienttoserver MI( int fromindex , int toindex);
    (MoveItem)
    アイテムを移動/装備/装備をはずす。装備になるかどうかは 移動の場所で決まる。

    目的地とは以下の通り。



    void old_lssproto_MI_send( int fd,int fromindex,int toindex )  {  	lssproto_CreateHeader( lssproto.work , "MI" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( fromindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( toindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • 0 兜を装備する所( 頭 )

    • 1 鎧を装備する所( 体 )

    • 2 攻撃アイテムを装備する所(手)

    • 3 装飾品を装備する所1

    • 4 装飾品を装備する所2

    • それ以上。 アイテム欄

    • int fromindex

    • 移動するアイテムのインデクス。

    • int toindex

    • 目的地のアイテムインデクス。

  • clienttoserver MSG( int index , string message , int color );
    (MeSsaGe) アドレスブックの相手にメッセージを送信。indexは自分のアドレスブッ クのインデクスである。





    void old_lssproto_MSG_send( int fd,int index,char* message,int color )  {  	lssproto_CreateHeader( lssproto.work , "MSG" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( index ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( message ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( color ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int index

    • アドレスブックにいる相手のインデクス。

    • string message

    • 相手に送信するメッセージ。EUCでサーバーに送信する。この文 字列はデリミタをふくまないので、エスケープする必要はない。

    • int color

    • メッセージの色。

  • clienttoserver PMSG( int index, int petindex, int itemindex, string message , int color );
    (PetMeSsaGe) アドレスブックの相手にペットでメッセージを送信。indexは自分のアドレスブッ クのインデクスである。アイテムも送信することが出来る。





    void old_lssproto_PMSG_send( int fd,int index,int petindex,int itemindex,char* message,int color )  {  	lssproto_CreateHeader( lssproto.work , "PMSG" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( index ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( petindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( itemindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( message ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( color ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  //	TNJ;  }
    • int index

    • アドレスブックにいる相手のインデクス。

    • int petindex

    • 何番目のペットで送信するか

    • int itemindex

    • 何番目のアイテムを送信するか。

    • string message

    • 相手に送信するメッセージ。EUCでサーバーに送信する。この文 字列はデリミタをふくまないので、エスケープする必要はない。

    • int color

    • メッセージの色。

  • clienttoserver AB(

            (AddressBook)      アドレスブックの内容をサーバーに問いあわせる。引数はない。サーバー      はこのコマンドをうけとるとアドレスブックの全エントリの内容を返す。
  • clienttoserver DAB( int index );
       (DeleteAddressBookitem)アドレスブックの項目を削除する。このコマ    ンドによってアドレスブックの内容が変化するので、サーバーはABコマ    ンドを送信して、クライアントに表示されているアドレスブックの内容    を更新する必要がある。サーバーがこのコマンドのために特に返答をすることはない。    



    void old_lssproto_DAB_send( int fd,int index )  {  	lssproto_CreateHeader( lssproto.work , "DAB" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( index ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int index

    • 消したい項目のindex.最初の項目が0である。

  • clienttoserver AAB( int x, int y );
       (AddAddressBookitem)    目の前にいるキャラクターをアドレスブックに加える。    成功するとアドレスブックの内容が変化するので、    サーバーはABコマンドを送信してクライアントの表示を更新する。



    void old_lssproto_AAB_send( int fd,int x,int y )  {  	lssproto_CreateHeader( lssproto.work , "AAB" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • 自分のx,y座標

  • clienttoserver L( int dir);
       (Look)    dir は方向。その方向を見る。見るとサーバでは直接見るイベントを発    生させる。クライアントでは、これ専用のボタンが用意されるなどして、    どんなキャラクタでも、いつでも、このコマンドを使うことができるよ    うにしておく。この操作は、宝箱をあける、ドアをあける、看板をみる、    目の前をしらべる(透明なNPCにたいして)、など、目の前にいるNPCに対    してアクセスする方法を提供するのが目的である。見たけっか、NPCが    ある動作をするが、その結果を文字列でクライアントに知らせるには、    TKコマンドをつかって送信する。    



       

    void old_lssproto_L_send( int fd,int dir )  {  	lssproto_CreateHeader( lssproto.work , "L" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dir ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver TK( int x, int y, string message ,int color, int area);
       (TalK)    チャット用メッセージを送信する。返答はない。

       



    void old_lssproto_TK_send( int fd,int x,int y,char* message,int color,int area )  {  	lssproto_CreateHeader( lssproto.work , "TK" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( message ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( color ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( area ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • Pの時
       先頭にC文字列の"P"がつく場合、それはプレイヤーが入  力したチャットメッセージである。クライアントプログラ  ムは、文字列の先頭にかならずこの文字とデリミタをつ  けくわえて送信する。サーバーは文字列の先頭に"P"を  検出したら声の当たり判定をして、聞こえる範囲に送信す  る。そのときはTKコマンドをつかうが、TKコマンドで送信す  る文字列にはこの"P"をふくめてそのまま入れる。  
       文字列の内容の例:  

      		  "P|きょうはいい天気ですな!!"

                       
       チャットメッセージを送信したときに聞こえる範囲を指定  するには、語尾に以下の文字列があるかをサーバが判定す  る。文字列の表記はCにおける表現である。'!' は全角文  字で入力される場合がままあるが、サーバは'!'だけに反  応する。クライアントプログラムが全角文字を半角文字に  なおして送信する。”!”一つおきにプレイヤーを中心に  1マス聞こえる範囲が増える。  

      "..."話したキャラクタと自分だけ


    • int x,y

    • 自分のx,y座標

    • string message

    • string の内容は, "|" で2つに区切られている。ひとつめのトー    クンの文字によって2つめのトークンの内容が変更される。2つめ    のトークンはエスケープされている。    ひとつめのトークンは以下のパターンがある。    

    • int color  

    • 文字列の色。  

    • int area  

    • 話した言葉が聞こえる範囲(1~を指定する。)  

  • clienttoserver M(int fl , int x1 , int y1 , int x2, int y2 );
       マップを要求する。このコマンドの返答はMコマンドでかえってくる。    送信タイミングは,MCが来てチェックサムがあわなかった時と,    歩きを計算した時に現れるマップが自分が持っていない時である。



    void old_lssproto_M_send( int fd,int fl,int x1,int y1,int x2,int y2 )  {  	lssproto_CreateHeader( lssproto.work , "M" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( fl ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x1 ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y1 ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x2 ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y2 ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int fl

    • フロア番号

    • int x1

    • 左上X

    • int y1

    • 左上Y

    • int x2

    • 右下X

    • int y2

    • 右下Y

  • clienttoserver C( int index );
       キャラの情報をダウンロードする。index CA のインデックス。返答は    C で返答される。エラーインデックスの時は、返答はない。    



    void old_lssproto_C_send( int fd,int index )  {  	lssproto_CreateHeader( lssproto.work , "C" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( index ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver S( string category );
       (Status)    キャラのステータスを要求する。どういう情報がかえってくるのかは、サーバーからの送信を参照。    この文字列はエスケープされない。    



       

    void old_lssproto_S_send( int fd,char* category )  {  	lssproto_CreateHeader( lssproto.work , "S" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( category ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • P 全パラメータ      

    • C 座標      

    • I 全アイテム      

    • S 全スキル      

    • T 全称号      

    • M 部分パラメータ      

    • E エンカウント確率      

    • K0 - K4 恐竜パラメータ      

    • D ID    


    • string category

    • どんな情報が欲しいのか。次のどれかを指定。    

  • clienttoserver FS( int flg);
       (FlgSet)仲間を受け入れるか,DUELOKのフラグ,チャットモード,名刺交換のモードをOn/Offする。

           
       



    void old_lssproto_FS_send( int fd,int flg )  {  	lssproto_CreateHeader( lssproto.work , "FS" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( flg ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int flg

    • 0 bit  0: 仲間Off                  1: 仲間On
                (現在未使用)1 bit  0: 戦闘途中参加off          1: 戦闘途中参加On
                2 bit  0: DUEL off                 1: DUEL On
                3 bit  0: 普通のチャットモード     1: パーティにしかチャットが飛ばないモード
                4 bit  0: 名刺交換OK               1: 名刺交換拒否

  • clienttoserver HL( int flg);
       (HeLp)お助けモードを设置する。これをONにすると,他の人が戦闘に参加する事が出来る。

           
       



    void old_lssproto_HL_send( int fd,int flg )  {  	lssproto_CreateHeader( lssproto.work , "HL" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( flg ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int flg

    • 0: お助けモードOff                  1: お助けモードOn

  • clienttoserver PR( int x, int y,int request);
       (PartyRequest)仲間に入るor除隊 を要求する。

           
       



    void old_lssproto_PR_send( int fd,int x,int y,int request )  {  	lssproto_CreateHeader( lssproto.work , "PR" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( request ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int x,y

    • 自分のx,y 座標

    • int request

    • 0: 除隊する1: 仲間にしてくれ

  • clienttoserver KS( int petarray);
       (Kyoryu Select)戦闘に出すペットを選択した。

           
       



    void old_lssproto_KS_send( int fd,int petarray )  {  	lssproto_CreateHeader( lssproto.work , "KS" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( petarray ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int petarray

    • 0 ~ 4 までの数字。選んだペットの持っている場所を示す。また,ペットを戦闘にエントリーしたくないようにする時は-1を入れる。

  • clienttoserver AC( int x, int y, int actionno);
       (action)喜怒哀楽などを表現する。

           
       



    void old_lssproto_AC_send( int fd,int x,int y,int actionno )  {  	lssproto_CreateHeader( lssproto.work , "AC" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( actionno ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int x,y

    • 自分のx,y 座標

    • int actionno

    • プレイヤーのとりたいアクションを送信する。サーバーはこれを受けとるとそのまま周りにアクション(CA)を送信する。    もしかしたら連打制御等をしないといけないかもしれない。番号とアクションの対応は以下の通り。

      actionno
      攻撃0
      ダメージ1
      倒れる2
      立っている3
      歩く4
      座る5
      手を振る6
      喜ぶ7
      怒る8
      悲しむ9
      ガード10
      うなずく11
      投げる12
  • clienttoserver MU( int x, int y, int array, int toindex);
       (magic use)魔法を使う。ほぼフィールド上からしか呼ばれない。バトル中は別プロトコルにて魔法使用の    プロトコルが飛んでくる。
       



    void old_lssproto_MU_send( int fd,int x,int y,int array,int toindex )  {  	lssproto_CreateHeader( lssproto.work , "MU" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( array ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( toindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int x,y

    • 自分のx,y 座標

    • int array

    • どの魔法を使ったか。この数字は P の Jn(n は任意の数字)に対応しなければいけない。

    • int toindex

    • 誰に魔法を使用したか。これはオブジェクトやキャラのindexではない。以下の様になっている。

      	  自分    = 0  	  ペット  = 1 ~5  	  仲間    = 6 ~10 (S N の0~4に対応。自分自身も含まれている)

                      対象が全員,とか分からない,とかの場合は-1で送信する。

         

  • clienttoserver PS( int havepetindex, int havepetskill, int toindex, string data);
       (PetSkill use )ペットの技を使う。フィールド上からしか呼ばれない。
       



    void old_lssproto_PS_send( int fd,int havepetindex,int havepetskill,int toindex,char* data )  {  	lssproto_CreateHeader( lssproto.work , "PS" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( havepetindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( havepetskill ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( toindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( data ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int havepetindex

    • 何番目のペットが使用したか。

    • int havepetskill

    • 何番目の技を使用したか。

    • int toindex

    • 誰に魔法を使用したか。これはオブジェクトやキャラのindexではない。以下の様になっている。

      	  自分    = 0  	  ペット  = 1 ~5  	  仲間    = 6 ~10 (S N の0~4に対応。自分自身も含まれている)

                      対象が全員,とか分からない,とかの場合は-1で送信する。

         

    • string data

    • 付加情報。アイテム合成の技の場合は,haveitemindex1|haveitemindex2|haveitemindex3|...
             と,合成するアイテムの番号が入っている。        

  • clienttoserver ST( int titleindex );
       (SelectTitle)    称号をえらぶ。titleindex が -1 のときは称号をはずすという事にな    る。

       結果は、Txt関数をつかって、「~のしょうごうをえらんだ!」のよう    に通知される。    
       



       

    void old_lssproto_ST_send( int fd,int titleindex )  {  	lssproto_CreateHeader( lssproto.work , "ST" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( titleindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int titleindex

    • 何番目の称号か。

  • clienttoserver DT( int titleindex );
       (DeleteTitle)    称号を削除する。

       結果は、Txt関数をつかって、「~のしょうごうをさくじょした!」のように通    知される。    
       



    void old_lssproto_DT_send( int fd,int titleindex )  {  	lssproto_CreateHeader( lssproto.work , "DT" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( titleindex ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int titleindex

    • 削除する称号のインデクス。

  • clienttoserver FT( string data );
       (inputFreeTitle)    自分で入力する称号を入力した。

       この結果は、Txt関数を使って、文字列で通知される。これにともない、    自分のCHARINDEXに対して、Chデータがふたたび送信されてくることに    なる。    
       



    void old_lssproto_FT_send( int fd,char* data )  {  	lssproto_CreateHeader( lssproto.work , "FT" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( data ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • string data

    • 自分で入力した称号。EUCでサーバーに送信される。この称号は、    マウスカーソルをあわせたときに画面下の1行infoに表示され    るものである。この文字列はデリミタをふくまないので、    エスケープする必要はない。

  • clienttoserver SKUP( int skillid );
       (SKillUP)    スキルアップボタンをおした。

       



    void old_lssproto_SKUP_send( int fd,int skillid )  {  	lssproto_CreateHeader( lssproto.work , "SKUP" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( skillid ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int skillid

    • どのスキルをあげるか。0=体力, 1=腕力, 2=丈夫さ, 3=素早さ

  • clienttoserver KN( int havepetindex, string data );
       (inputKyoryuName)    ペットの名前を入力した。

       この結果は、Txt関数を使って、文字列で通知される。これにともない、    ペットのステータスが再び送られてくる。    
       



    void old_lssproto_KN_send( int fd,int havepetindex,char* data )  {  	lssproto_CreateHeader( lssproto.work , "KN" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( havepetindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( data ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • int havepetindex

    • ペットの番号。

    • string data

    • 自分のペットにオリジナルの名前を与える。    

  • clienttoserver WN( int x, int y, int seqno, int objindex, int select, string data );
       
       ウィンドウ表示に対する返答
       
       
       



    void old_lssproto_WN_send( int fd,int x,int y,int seqno,int objindex,int select,char* data )  {  	lssproto_CreateHeader( lssproto.work , "WN" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( seqno ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( objindex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( select ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( data ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int x,y

    • キャラクターのx,y座標

    • int seqno

    • サーバーから来たseqnoをそのまま返す

    • int objindex

    • サーバーから来たobjindexをそのまま返す

    • int select

    • どのボタンを選択した,または何を選択したか。サーバーのWN のbuttontype のdefineと同じ形式で返す。

    • string data

    • 1行入力ウィンドウがあれば,その入力したデータ。          選択ウィンドウの場合は,その選択した番号。(1から)          また,ペット,仲間選択ウィンドウでは,ペットが1~5,仲間が6~10となる。          

      ?お店の場合?
                買うの時:選択した番号(1~?)と個数。
                売るの時:選択したアイテム欄の番号(1~?)|金額
          その他 :買う:1 売る:2 出る:3          


      ?ペットの技の場合?
      どの技をえらんだか?(選択番号)|どのペットか?(選択番号)|どのスロットか?(選択番号)|値段

  • clienttoserver ClientLogin(string cdkey,string passwd);
       クライアントがサーバーにログインするときに使う。つまりアカウント    のログインと考えればよい。ゲーム内容にタッチする種類の関数は、す    べてこのログインをしないと実行されないようになっている。この関数    はただ単にクライアントの情報をゲームサーバにたくわえるためだけの    物である。また、パスワード変更したら、再度この関数を呼ぶ事。        

       



       

    void old_lssproto_SP_send( int fd,int x,int y,int dir )  {  	lssproto_CreateHeader( lssproto.work , "SP" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( x ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( y ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dir ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  //	TNJ;  }

    • string cdkey

    • CDKEY

    • string passwd

    • パスワード。この文字列はエスケープされない。

  • clienttoserver ClientLogin(string cdkey,string passwd);
       ?????????????????????????????????    ??????????????????????????????????    ?????????????????????????????????    ????O?????????雪???????????????????    ???????????????????????T?????????        

       



       

    void old_lssproto_ClientLogin_send( int fd,char* cdkey,char* passwd )  {  	lssproto_CreateHeader( lssproto.work , "ClientLogin" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( cdkey ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( passwd ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • string cdkey

    • CDKEY

    • string passwd

    • ???????????????????????

  • clienttoserver CreateNewChar(int dataplacenum, string charname,int imgno , int faceimgno, int vital, int str, int tgh, int dex, int earth, int water, int fire, int wind, int hometown);
       新しいキャラクターを作る。    

             



       

    void old_lssproto_CreateNewChar_send( int fd,int dataplacenum,char* charname,int imgno,int faceimgno,int vital,int str,int tgh,int dex,int earth,int water,int fire,int wind,int hometown )  {  	//cary  	if(imgno>=100239)  		return;  	//end  	lssproto_CreateHeader( lssproto.work , "CreateNewChar" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dataplacenum ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( charname ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( imgno ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( faceimgno ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( vital ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( str ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( tgh ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( dex ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( earth ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( water ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( fire ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( wind ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( hometown ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    • int dataplacenum

    • キャラの番号。これによってクライアントはキャラクターリストのどの場所にこのキャラを表示すればいいかを判断する。

    • string charname

    • キャラ名(空白と改行がない、プレーンな文字列)。    この文字列はデリミタを使わないので、エスケープする必要はない。

    • int imgno

    • キャラクターの画像番号。

    • int faceimgno

    • 顔の画像番号。名刺交換等に使用される。

    • int vital, str,tgh dex

    • 各パラメータ。

    • int earth, water, fire, wind

    • 各属性値

    • int hometown

    • 出身地。0~の数値で渡される。

    • string option さらに、ゲーム内容的に、キャラ作成時に指定できるパラメータの値 には限界がある。これは仕様書を参照すること。この文字列はエスケー プしない。

  • clienttoserver CharDelete(string charname);
       キャラを消す。    

       
       



    void old_lssproto_CharDelete_send( int fd,char* charname )  {  	lssproto_CreateHeader( lssproto.work , "CharDelete" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( charname ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • string charname

    • キャラ名。デリミタをふくまないのでエスケープしない。

  • clienttoserver CharLogin(string charname);
       キャラクターがサーバーにログインするときに使う。    

       



    void old_lssproto_CharLogin_send( int fd,char* charname )  {  	lssproto_CreateHeader( lssproto.work , "CharLogin" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( charname ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • string charname

    • キャラ名。デリミタをふくまないので、エスケープしない。

  • clienttoserver CharList(

          キャラリストを得る。              [object Object]
  • clienttoserver CharLogout(void);
       キャラクターがサーバーからログアウトするときに使う。    引数なし。    



       

    void old_lssproto_CharLogout_send( int fd )  {  	lssproto_CreateHeader( lssproto.work , "CharLogout" );  	lssproto_strcatsafe( lssproto.work , "" ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver ProcGet(void);
       proc データを取得する。これによってログイン人数を調べたりする事が出来る。    



       

    void old_lssproto_ProcGet_send( int fd )  {  	lssproto_CreateHeader( lssproto.work , "ProcGet" );  	lssproto_strcatsafe( lssproto.work , "" ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver PlayerNumGet(void);
       プレイヤーとログイン人数を取得する。    



       

    void old_lssproto_PlayerNumGet_send( int fd )  {  	lssproto_CreateHeader( lssproto.work , "PlayerNumGet" );  	lssproto_strcatsafe( lssproto.work , "" ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
  • clienttoserver Echo( string test);
       サーバーが生きているかをテストしたり、テスト用に使う。    

       



       

    void old_lssproto_Echo_send( int fd,char* test )  {  	lssproto_CreateHeader( lssproto.work , "Echo" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( test ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    • string test

    • エコー用文字列。エスケープしない。

  • clienttoserver Shutdown( string passwd, int min);
       シャットダウン処理開始送信

       メンテナンスを行いたい時に,自動的に「あとn分でメンテナンスを行います」のメッセージを1分毎に    流してくれる。最初にdenyaccept()を行うので,ユーザーはログイン出来なくなり,    最後にcloseallsockets()を行ってキャラのセーブと強制ログアウトを行う。    

       



    void old_lssproto_Shutdown_send( int fd,char* passwd,int min )  {  	lssproto_CreateHeader( lssproto.work , "Shutdown" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( passwd ) ,lssproto.workbufsize );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_int( min ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    // Robin 2001/04/10 trade

    void old_lssproto_TD_send( int fd,char* message )  {  	lssproto_CreateHeader( lssproto.work , "TD" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( message ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }
    void old_lssproto_FM_send( int fd,char* message )  {  	lssproto_CreateHeader( lssproto.work , "FM" );  	lssproto_strcatsafe( lssproto.work , lssproto_mkstr_string( message ) ,lssproto.workbufsize );  	lssproto_Send( fd , lssproto.work );  }

    int lssproto_ClientDispatchMessage(int fd ,char*line) { int msgid; char funcname[1024]; lssproto_strcpysafe( lssproto.work , line,lssproto.workbufsize ); lssproto_splitString( lssproto.work); lssproto_GetMessageInfo( &msgid , funcname , sizeof(funcname),lssproto.token_list);


    • string passwd

    • やばいプロトコルの為,一応パスワードを设置しておく。

    • int min

    • 「あとn分でメンテナンスを行います」のn分を设置する。

  • servertoclient EV(int seqno,int result);
    クライアントのEVに対しての返答を行う。 これを受け取るまでクライアントは再び歩いたりすることが 出来ない。



    if( strcmp( funcname , "XYD" ) == 0 ){ int x; int y; int dir; x = lssproto_demkstr_int( lssproto.token_list[2] ); y = lssproto_demkstr_int( lssproto.token_list[3] ); dir = lssproto_demkstr_int( lssproto.token_list[4] ); lssproto_XYD_recv( fd,x,y,dir); //战斗结束后的大地图座标 return 0; }


    • int seqno

    • クライアントEVのseqnoに対応する。

    • int result

    • 結果。0:イベント実行不可。 1:成功。この後に色んなイベントに対する通信テキストが投げられてくるはず。

  • servertoclient EV(int seqno,int result);
    ???????EV??n?????????? ?????????????????????????????? ??????



    if( strcmp( funcname , "EV" ) == 0 ){ int seqno; int result; seqno = lssproto_demkstr_int( lssproto.token_list[2] ); result = lssproto_demkstr_int( lssproto.token_list[3] ); lssproto_EV_recv( fd,seqno,result); return 0; }


    • int seqno

    • ??????EV?seqno??n????

    • int result

    • ???0:??????????? 1:??????????????????n???G?????????????????

  • servertoclient EN(int result,int field);
    クライアントのEN又はDUに対しての返答を行う。または,仲間歩き時に親がエンカウントした場合に送られてくる。



    if( strcmp( funcname , "EN" ) == 0 ) { int result; int field; result = lssproto_demkstr_int( lssproto.token_list[2] ); field = lssproto_demkstr_int( lssproto.token_list[3] ); lssproto_EN_recv( fd,result,field); return 0; }

    • int result

    • 結果。0:エンカウント不可orエラー。 1:敵との戦闘OK。2:対人との戦闘OK。この後は戦闘に関する通信 テキストが投げられてくるはず。

    • int field

    • バトルフィールド番号。

  • servertoclient RS( string data );
    戦闘終了後、取得したEXP及びアイテムを通知。
    RS|番号(10進)|レベルアップフラグ(10進)|EXP(62進),番号|レベルアップフラグ|EXP,???,アイテム名|アイテム名|アイテム名

        番号~経験値は5人分。一人分の区切りは","。最初の一人目には必ずプレイヤーが来る。そのときの番号は-2。
    2人目以降4人目まではペットの番号(0~4)ペットが経験値をもらわなかった場合は項目が無くなり、次の","が来る。
    最後にアイテムの名前が"|"で区切られてくる。最大3個。無かった場合はすぐに次の"|"が来る。 if( strcmp( funcname , "RS" ) == 0 ) { char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_RS_recv( fd,data); return 0; }

  • servertoclient RD( string data );
    DUEL終了後、取得又は失ったDUELポイントを通知。
    RD|得た(失った)DP(62進)|最終的なDP(62進)|

    if( strcmp( funcname , "RD" ) == 0 ) { char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_RD_recv( fd,data); return 0; }

  • servertoclient B( string command );
    戦闘時のコマンドを全て扱う。数値には全て 大文字16進を使う。
    ここで[相手番号]とは、バトルの中での管理番号となる。 手前プレイヤーは0~4、手前ペットは5~9、向こう側は10~19である。 

    ムービーデータ

    ムービーデータ部分は全てつながった文字列で処理される。文字のつなげ方は
    マクロ( BATTLESTR_ADD( 文字列 ) )を使ってつなげる。つながった文字はターン終了後にクライアントにまとめて転送する。
    ここではキーワード以外は全て数値データであり、数値以外は無視。また小文字英字も無視(コメントとして使用できる)

    ムービー時のフラグの意味:ビット処理する。
    ---0ビット目:空振り
    ---1ビット目:通常ヒット
    ---2ビット目:会心の一撃
    ---3ビット目:防御
    ---4ビット目:カウンター
    ---5ビット目:よけた
    ---6ビット目:アルティメットKOその1
    ---7ビット目:アルティメットKOその2
    ---8ビット目:ガードブレイク攻撃した
    ---9ビット目:守護者がいる

    毎ターン最初に送られるデータ

    毎ターンコマンド決定までのカウントダウン中に送られるデータ





    if( strcmp( funcname , "B" ) == 0 ){ char* command; command = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_B_recv( fd,command); return 0; }

    • BA|のとき、コマンド完了&ターン数データ。これは誰かがコマンドをサーバーに送るたびに、全員に送られる。
      BA|コマンド完了ビット(%X)|ターン数(%X)| 

      コマンド完了ビットはビット単位で構成し、0番目のキャラがコマンドを完了したら、 0ビット目がONになる。クライアントはビットがONになっているキャラクタは アニメーションさせ、OFFのキャラはアニメーションを停止させ、コマンドの完了したかどうかを区別する。
      ターン数はムービーが全く開始されていない場合は0ターン目とし、ムービー が開始された瞬間にインクリメントされる。

    • BC|のとき、キャラクターデータ。これは毎ターン全員に同じものが送られる。
      BC|番号[0~19](%X)|キャラ名(%s)|画像番号(%X)|レベル(%X)|HP(%X)|フラグ(%X)|???

      フラグの意味:ビット処理する。
      ---0ビット目:新規参加
      ---1ビット目:死亡
      ---2ビット目:プレイヤーかどうか
      ---3ビット目:毒
      ---4ビット目:麻痺
      ---5ビット目:眠り
      ---6ビット目:石化
      ---7ビット目:酔っ払い
      ---8ビット目:混乱

    • BP|のとき、自分の個人データ。これは毎ターン本人にのみ送られる。
      BP|自分の番号[0~19](%X)|フラグ(%X)|現在の気力(%X)|???

      フラグの意味:ビット処理する。
      ---0ビット目:自分が新規参加
      ---1ビット目:自分が不意打ちを食らっている
      ---2ビット目:ブーメランを持っているか

    • BH|のとき、通常攻撃ムービー
      BH|攻撃側番号|守備側番号|フラグ|ダメージ|守備側番号|フラグ|ダメージ|????と繰り返す。守備側番号がFFだったらこのコマンドの終了とみなす。

      (通常攻撃例) B|BH|attack_0|defense_A|flag_2|damage_32|defense_B|flag_2|damage_32|FF|
      これは0番が(attack_0)A番(defense_A)に0x32ダメージを与え(damage_32)その後B番(defense_B)にも攻撃を行い、0x32ダメージ(damage_32)を与えたこととする。

      (カウンター時例) B|BH|attack_0|defense_A|flag_2|dagame_32|counter_0|flag_10|damage_16|FF|
      これは0番が(attack_0)がA番に攻撃し(defense_A)ダメージ0x32(damage_32)を与えその後、0番(counter_0)がカウンターで(flag_10)ダメージ0x16(damage_16)を食らった。ここでだれがカウンターを発動したかはその直前に攻撃されたものが選ばれる。

      (守護者がいる例) B|BH|attack_0|defense_A|flag_202|dagame_32|gardian_B|FF|
      これは0番が(attack_0)がA番に攻撃し(defense_A)ダメージ0x32(damage_32)を与えたはずだが、B番が守護者になった為そちらにダメージがいった。


    • BT|のとき、敵捕獲ムービー
      BT|攻撃側番号|守備側番号|フラグ|
      フラグが1だったら捕獲成功。0だったら捕獲失敗。失敗時にどのあたりまで敵を 引っ張ってくるかはクライアントがランダムで判定する。

    • BE|のとき、逃亡ムービー
      BE|逃げる側番号|守備側番号|フラグ|
      フラグが1だったら捕獲成功。0だったら捕獲失敗。失敗時にどのあたりまで敵を 引っ張ってくるかはクライアントがランダムで判定する。プレイヤーキャラが逃げた 場合はペット用のBEは無しでペットも逃げるようにする。

    • bg|のとき、ガードムービー
      bg|ガードする側番号|
      これは小文字で送ること。キャラクタの動きは無い。クライアントも別にこの文字を処理せず、コメント扱い。そのための小文字。 だがわかりにくいため一応送っておく。

    • BD|のとき、HP、MP変更ムービー
      BD|変更されるキャラ番号|変更の種類|プラスかマイナスか|増減値|
      変更の種類は0がHP。1がMP。プラスかマイナスかは1がプラス0がマイナス

    • BF|のとき、ペットが後ろに隠れるムービー
      BF|隠れるキャラ番号|
      ペットのみが使用できて、クライアントではペットが背後に走っていっていなくなる 演出がある。地球一週等で使用

    • BJ|のとき、呪術、アイテム演出ムービー
      BJ|呪術使用キャラ番号|呪術使用側エフェクト番号|呪術受け側エフェクト番号|受けるキャラ番号|受けるキャラ番号|???|FF|
      アイテム、呪術を使用した場合に使う。影響を受けるキャラ番号は連続して記述できるが最後はFFでしめる。 

    • BB|のとき、飛び道具攻撃ムービー
      BB|攻撃側番号|飛び道具の種類|守備側番号|フラグ|ダメージ|守備側番号|???|FF|
      2番目の引数に飛び道具の種類が入る以外は内容は通常攻撃と同じ。
      飛び道具の種類は0なら弓矢。1なら命中時に跳ねかえる武器。2なら命中時に破裂する武器。

    • BM|のとき、ステータス異常変化ムービー
      BM|ステータス変化するキャラ番号|どのステータス異常か|
      ステータス異常番号は
      ---0:ステータス異常無し
      ---1:毒
      ---2:麻痺
      ---3:眠り
      ---4:石化
      ---5:酔っ払い
      ---6:混乱

    • BO|のとき、ブーメランムービー
      BO|攻撃側番号|守備側番号|フラグ|ダメージ|守備側番号|???|FF|
      2番目の引数に飛び道具の種類が入る以外は内容は通常攻撃と同じ。

    • BS|のとき、ペット出し入れムービー
      BS|ペットの番号[0~19](%X)|フラグ|画像番号|レベル|HP|名前|
      フラグ0の時はペットが戻るとき。その際はそれ以降後ろの文字は無視される
      フラグ1の時はペットが出るとき。ペットの交換をしたい場合は戻してから出すというように2回BSコマンドを送ること。

    • BU|のとき、戦闘から抜けるムービー
      引数無し。このコマンドはクライアントがネット等の状態で異常に遅延し、サーバーが待ちきれなくなった場合にそのクライアントを強引に戦闘から抜けさせる処理を行った後に送信される。

    • BV|のとき、フィールド属性変更ムービー
      BV|変更をかけたキャラ番号|変更する属性番号|
      変更する属性番号は、
      ---0:無属性
      ---1:地属性
      ---2:水属性
      ---3:火属性
      ---4:風属性

    • BY|のとき、合体攻撃ムービー
      BY|守備側番号|攻撃側番号|フラグ|ダメージ|攻撃側番号|フラグ|ダメージ|????と繰り返す。通常攻撃と攻守が入れ替わった形。

  • servertoclient I( string data );
    (item)

    アイテム情報。S I は全アイテムを送信するのに対してこれは指定されたアイテム番号のアイテムを 複数個送信することが出来る。




    if( strcmp( funcname , "I" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_I_recv( fd,data); return 0; }

    • string data

    • アイテム情報。 アイテムの内容は以下の方法でパックする。 ひとつのアイテムは、かならずトークンのセットで 送信される。ほとんど,S Iのプロトコルと同じだが,先頭のトークンにアイテムの場所が 付いています。これによって何番目のアイテムかを判断する。

  • servertoclient SI( int fromindex, int toindex );
    (SwapItem) アイテムをいれかえる。みかけ上の意味はMIと同じだが、 サーバーからクライアントへの通知であるということと、 使用する目的が異なる。SIは、サーバが勝手にアイテムの 状況を変化させたとき(典型的には、装備を変更したとき)に、 どのアイテムをどこに移動させたのかをクライアントに通知するために 使用する。この目的は、クライアントでアクションボタンをつかって 装備を変更することを可能にするためである。 装備を変更したらそのアイテムがどこにいったのかがわからないと どのアイテムをアクションボタンに残せばいいのかがわからないからである。 サーバーは、装備を変更したときに、 何番から何番に変更したのかをクライアントに通知する。目的地の意味は、MIと同じである。 



    if( strcmp( funcname , "SI" ) == 0 ){ int fromindex; int toindex; fromindex = lssproto_demkstr_int( lssproto.token_list[2] ); toindex = lssproto_demkstr_int( lssproto.token_list[3] ); lssproto_SI_recv( fd,fromindex,toindex); return 0; }


    • int fromindex

    • 移動するアイテムのインデクス。

    • int toindex

    • 目的地のアイテムインデクス。

  • servertoclient MSG( int aindex , string text , int color );
    (MeSsaGe) サーバからクライアントにたいして、アドレスブックによるメッセージ の送信をおこなう。通常のチャットメッセージとことなり、受信フラグ やキューイングなどの処理があるためTとは別のプロトコルとしている。



    if( strcmp( funcname , "MSG" ) == 0 ){ int aindex; char* text; int color; aindex = lssproto_demkstr_int( lssproto.token_list[2] ); text = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); color = lssproto_demkstr_int( lssproto.token_list[4] ); lssproto_MSG_recv( fd,aindex,text,color); return 0; }

    • int aindex

    • アドレスブックのインデクス。このインデクスで特定される相手 からのメッセージであることをしめす。

    • string text

    • メッセージの内容。エスケープする必要はない。メッセージの内容は,mm/dd hh:mm|text...|graphicsno|lv|name|itemgraphicsno となっていて最初のトークンは日付ヘッダが入っている。次は実際のメッセージの内容。次は画像番号。 通常メールは-1。この場合はこれ以降のトークンは存在しない。(例)mm/dd hh:mm|text|-1 ペットメールの場合は,運んできたペットの画像番号が格納されている。 lvはメールを運んできたペットのレベル。次は名前が格納されている。これはエスケープされている。 itemgraphicsno は運んできたアイテムの画像番号が格納されている。

    • int color

    • 色。


  • servertoclient PME( int objindex, int graphicsno, int x, int y, int dir, int flg, int no, string cdata );
    (PetMeSsaEffect) ペットメールでの,ペットの登場を表現する。





    if( strcmp( funcname , "PME" ) == 0 ){ int objindex; int graphicsno; int x; int y; int dir; int flg; int no; char* cdata; objindex = lssproto_demkstr_int( lssproto.token_list[2] ); graphicsno = lssproto_demkstr_int( lssproto.token_list[3] ); x = lssproto_demkstr_int( lssproto.token_list[4] ); y = lssproto_demkstr_int( lssproto.token_list[5] ); dir = lssproto_demkstr_int( lssproto.token_list[6] ); flg = lssproto_demkstr_int( lssproto.token_list[7] ); no = lssproto_demkstr_int( lssproto.token_list[8] ); cdata = lssproto_wrapStringAddr( lssproto_stringwrapper[8] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[9] )); lssproto_PME_recv( fd,objindex,graphicsno,x,y,dir,flg,no,cdata); return 0; }

    • int objindex

    • ペットのオブジェクト番号。

    • int graphicsno

    • 登場するペットの画像番号

    • int x,y

    • どの位置に出現するか

    • int dir;

    • どの方向に向かっていくか。

    • int flg

    • 行きしなか(0),帰りしなか(1)。

    • int no

    • 演出番号。

    • string cdata

    • C のデータが入っている。帰ってくる時のような演出の時には,そのままオブジェクトとなるので これが必要。これを元にオブジェクトを作成する。このプロトコルが来た場合, このキャラクタのC はこないものとする。

  • servertoclient AB( string data );
    サーバーがクライアントに送信するアドレスブックの全内容。



    if( strcmp( funcname , "AB" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_AB_recv( fd,data); return 0; }

    • string data

    • 情報の内容。表示するために必要な情報は、有効か無効かのフラグ,相手のキャラの名前、 レベル、デュエルポイント,オンラインかどうかのフラグ。 それが人数分ならんでいる。 データはその時点での最新である。 一人目|二人目|...人数に制限はない。 一人分のメッセージは以下の構成である。 
      使用フラグ|名前(文字列)|レベル数値|duelpoint|フラグ|画像番号 
      したがって、 N人目の名前にアクセスするには 4(N-1)+1番目の トークンを、しらべればよいことになる。そのトークンが存在し ないならば、それ以降のエントリは存在しない。名前文字列はエスケープしてからたて棒でつなぐ。 フラグは0ならオフライン、1以上ならオンラインである。 この値はどのサーバの人がオンラインかを見分ける為に, setup.cfにて servernumber=n のnの値が送信される。 特別な機能として、名前のトークンが空の場合は、以前のAB コマンドで受信した名前の情報を更新せずにレベルとライフの 項目だけを更新する。というのは名前の情報はキャラ作成後 2度と更新されないからだ。

  • servertoclient ABI( int num, string data );
    ABの単体版。num には自分のアドレスブックの何番目かと言う事が入っている。 dataの中身はABに準ずる。




    if( strcmp( funcname , "ABI" ) == 0 ){ int num; char* data; num = lssproto_demkstr_int( lssproto.token_list[2] ); data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_ABI_recv( fd,num,data); return 0; }

  • servertoclient TK( int index,string message ,int color);



    if( strcmp( funcname , "TK" ) == 0 ){ int index; char* message; int color; index = lssproto_demkstr_int( lssproto.token_list[2] ); message = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); color = lssproto_demkstr_int( lssproto.token_list[4] ); lssproto_TK_recv( fd,index,message,color); return 0; }

    • "P" の時。
      チャットメッセージ。自分のメッセージも含まれる。とり あえずローカルエコーはなし。例は以下のとおり

      		  "P|あほあほあ"
    • "F"の時。

      	          F|charaindex|メッセージ

      吹き出し文字のメッセージ。指定されたcharaindexに吹き出しが出て メッセージを表示する。

    • index

    • しゃべったキャラのインデックス。-1 の時は、ふきだしの必 要のないシステムメッセージ

    • string

    • string の内容は, "|" で2つに区切られている。ひとつめのトー クンの文字によって2つめのトークンの内容が変更される。2つめ のトークンはエスケープされている。 ひとつめのトークンは以下のパターンがある。

    • color

    • キャプション色。色の定義は?

  • servertoclient MC(int fl , int x1 , int y1 , int x2, int y2, int tilesum, int objsum, int eventsum,string data );
    マップを送る前にマップのチェックサムを送る。クライアントは自分のローカルのマップデータのチェックサムを計算し, これと比べて合っていなかったらMを送信する。合っている場合はMを送らずにクライアントのマップデータをそのまま使う。



    if( strcmp( funcname , "MC" ) == 0 ){ int fl; int x1; int y1; int x2; int y2; int tilesum; int objsum; int eventsum; char* data; fl = lssproto_demkstr_int( lssproto.token_list[2] ); x1 = lssproto_demkstr_int( lssproto.token_list[3] ); y1 = lssproto_demkstr_int( lssproto.token_list[4] ); x2 = lssproto_demkstr_int( lssproto.token_list[5] ); y2 = lssproto_demkstr_int( lssproto.token_list[6] ); tilesum = lssproto_demkstr_int( lssproto.token_list[7] ); objsum = lssproto_demkstr_int( lssproto.token_list[8] ); eventsum = lssproto_demkstr_int( lssproto.token_list[9] ); data = lssproto_wrapStringAddr( lssproto_stringwrapper[9] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[10] )); #ifdef __SKYISLAND extern

    void SkyIslandSetNo( int fl);  		SkyIslandSetNo( fl);  #endif  		lssproto_MC_recv( fd,fl,x1,y1,x2,y2,tilesum,objsum,eventsum,data);  		return 0;  	}
    • int fl

    • フロア番号

    • int x1

    • 左上X

    • int y1

    • 左上Y

    • int x2

    • 右下X

    • int y2

    • 右下Y

    • int timesum

    • タイルのチェックサム

    • int objsum

    • オブジェクトのチェックサム

    • int eventsum

    • イベントオブジェクトのチェックサム。イベントオブジェクトはもしも重なっていたら1番上(マップリンクデータ上で)のものが使用される。

    • string data

    • フロアの名前文字列(クライアントがMを送らなかった時に使用する)

  • servertoclient M(int fl , int x1 , int y1 , int x2, int y2 ,string data );
    マップを送信する。どんな矩形でも送信できる。もちろん最大サイズ はきまっていてよい。これはサーバーからのみ送信し、クライアント が要求することはない。送信のタイミングは、キャラにとってあたら しい部分が見えるようになった瞬間や、地形が変更された瞬間である。 





    if( strcmp( funcname , "M" ) == 0 ){ int fl; int x1; int y1; int x2; int y2; char* data; fl = lssproto_demkstr_int( lssproto.token_list[2] ); x1 = lssproto_demkstr_int( lssproto.token_list[3] ); y1 = lssproto_demkstr_int( lssproto.token_list[4] ); x2 = lssproto_demkstr_int( lssproto.token_list[5] ); y2 = lssproto_demkstr_int( lssproto.token_list[6] ); data = lssproto_wrapStringAddr( lssproto_stringwrapper[6] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[7] )); lssproto_M_recv( fd,fl,x1,y1,x2,y2,data); return 0; }

    • int fl

    • キャラのいるフロア番号

    • int x1

    • フロアマップの中の絶対位置。左上X

    • int y1

    • フロアマップの中の絶対位置。左上Y

    • int x2

    • フロアマップの中の絶対位置。右下X

    • int y2

    • フロアマップの中の絶対位置。右下Y

    • string data

    • フロアの見える文字列|タイル|オブジェクト|イベントオブジェクト になっている。 dataはマップタイル番号で"76,76,77,78,98,90,1,1,1,2"という ように必要な要素数並んでいる。スペースでくぎるとエスケープ の関係上、量がおおくなるので、コンマでくぎる。階段などに進 んだ場合、全画面分を送信して、一歩あるく場合は一歩分だけお くる。こういう判断はサーバーでやるしかない。クライアントは この関数でマップをうけとると、それをディスクに保存して、オー トマップ用の情報をたくえる。この文字列はエスケープする必要がある。 イベントオブジェクトはもしも重なっていたら1番上(マップリンクデータ上で)のものが使用される。

  • servertoclient C( string data );
    (Characters) クライアントは CA が来て、そのキャラについて調なかった時は、 C でこの関数を要求できる。サーバはチェックしない。 





    if( strcmp( funcname , "C" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_C_recv( fd,data); return 0; }

    • たて棒でくぎられたトークンが12個の場合
      トークンの内容は WHICHTYPE|CHARINDEX|X|Y|DIR|BASEIMG|LEVEL|NAMECOLOR|NAME|SELFTITLE|WALKABLE|HEIGHT このオブジェクトはキャラクターであるということである。
      WHICHTYPE は,このキャラクターがどういった種類のもの であるか。これはサーバーでは以下のように定義されている。

      		typedef enum  		{  		    CHAR_TYPENONE,          何でもない  		    CHAR_TYPEPLAYER,        プレイヤー  		    CHAR_TYPEENEMY,         敵  		    CHAR_TYPEPET,           ペット  		    CHAR_TYPEDOOR,          ドア  		    CHAR_TYPEBOX ,          宝箱  		    CHAR_TYPEMSG ,          看板  		    CHAR_TYPEWARP ,         ワープゾーン  		    CHAR_TYPESHOP ,         店  		    CHAR_TYPEHEALER ,       ヒーラー  		    CHAR_TYPEOLDMAN ,       長老  		    CHAR_TYPEROOMADMIN,     不動産屋  		    CHAR_TYPETOWNPEOPLE,    まちのひと  		    CHAR_TYPEDENGON,        伝言版  		    CHAR_TYPEADM,           伝言版  		    CHAR_TYPETEMPLE,        Temple master  		    CHAR_TYPESTORYTELLER,   語り部  		    CHAR_TYPERANKING,       不動産ランキング表示NPC  		    CHAR_TYPEOTHERNPC,      その他の検索対象にならないNPC  		    CHAR_TYPEPRINTPASSMAN,  ドアのパスワード表示するNPC  		    CHAR_TYPENPCENEMY,      固定敵  		    CHAR_TYPEACTION,        アクションに反応するNPC  		    CHAR_TYPEWINDOWMAN,     ウィンドウ表示するNPC(テストかも)  		    CHAR_TYPESAVEPOINT,     セーブポイント  		    CHAR_TYPEWINDOWHEALER,  ウインドウタイプのヒーラー  		    CHAR_TYPEITEMSHOP,	    お店  		    CHAR_TYPESTONESHOP,	    石盤屋(ペットの技屋)  		    CHAR_TYPEDUELRANKING,   DUELランキングNPC  		    CHAR_TYPENUM,  		}

      CHAR_TYPE; それは他のプレイヤーやNPCや敵である。サーバーが送信 するときは見える範囲について全部送信する。つま りクライアントは、このパケットを受けとったときにこの パケットに書かれていないキャラを持っていたら消してし まってよいということである。また、マウスカーソルをあ わせたときに表示する情報はこの情報のみに基いている。 だから、マウスカーソルをあわせたときに表示することが 変更された場合は、サーバーは、この関数を能動的に呼び ださなければならない。 SELFTITLEについては、デリミタ であるたて棒をふくまないようにエスケープされている。 クライアントはアクションのコマンド(CA)がくるまでは立 ちで表示する。CHARINDEXサーバー内の一意にキャラを特 定できる番号、BASEIMGは表示のための番号、LEVELはキャ ラのレベル(0なら表示しない。この値はNPCなどに使う。) WALKABLEは1のときその上を通過することができ、0なら通 過することができない。HEIGHTは高さをもつものかそうで ないのかの指定。 キャラクターの名前と自由称号は、 エスケープされなければならない。'|'でトークンを 取りだしてからエスケープを解除する。エスケープすると' |'がほかの文字におきかわるので、最初は単純に'|'をデ リミタとしてよい。送信する方も、名前と自由称号をエス ケープしてからたて棒でつないでから送信する。 また,ペットの場合は自由称号の代わりにユーザーが设置 したペットの名前が送信されてくる。

    • たて棒でくぎられたトークンが6個の場合
      トークンの内容は INDEX|X|Y|BASEIMG|LEVEL|ITEM1LINEINFO で地面に落ちているアイテムについての情報である。 INDEXはキャラのインデクッスとかぶらないINDEXである。 そのアイテムを消す時に使用する。X,Yはアイテムのグロー バル位置。BASEIMGは画像の番号。ITEM1LINEINFOは1行 infoに表示するための情報である。アイテムウインドウ内 の表示用の情報は別の方法で用意する。アイテムに関して はCAは来ない。ITEM1LINEINFOはエスケー プされる。このエスケープの方法は上の項目を参照。

    • たて棒でくぎられたトークンが4個の場合
      トークンの内容は INDEX|X|Y|VALUE で地面に落ちているお金についての情報である。内容はす べて数字。INDEX,X,Y はアイテムと同じ。VALUE はどれだ けの量かという事である。アイテムについての情報である。

    • たて棒でくぎられたトークンが1個の場合
      INDEX このキャラのCは教えられない。

    • string data

    • フォーマットは 以下の3種類の項目をコンマでならべた ものである.それぞれの項目の中身はさらにたて棒'|'でくぎられ ている。

  • servertoclient CA( string data );
    (CharacterAction) 見える範囲にいるキャラのアクション状態を更新する。 サーバーからクライアントに一方的に送信する。 各キャラの1アクションごとに送信。サーバーはアクションをできるだ け圧縮すること。





    if( strcmp( funcname , "CA" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_CA_recv( fd,data); return 0; }

    • string data

    • CHARINDEX|X|Y|ACTION|PARAM1|PARAM2|PARAM3|PARAM4|....をコ ンマでくぎったものにする。PARAMはアクションごとに個数も 使いかたもことなる。以下はアクション一覧。X,Yは位置でど のアクションでも、あたらしい位置を指定する。 この文字列はエスケープされない。

      ACTIONPARAM1PARAM2PARAM3PARAM4
      Stand:0方向0~7


      Walk:1方向0~7


      Attack:2方向0~7


      Throw:3方向0~7


      Damage:4方向0~7


      Dead:5方向0~7


      UseMagic:6方向0~7


      UseItem:7方向0~7


      Effect:8方向0~7エフェクト番号

      Down:10 (倒れる)方向0~7


      Sit:11 (座る)方向0~7


      Hand:12 (手を振る)方向0~7


      Pleasure:13 (喜ぶ)方向0~7


      Angry:14 (怒る)方向0~7


      Sad:15 (悲しむ)方向0~7


      Guard:16 (ガード)方向0~7


      walk:17 (アクション用歩き)方向0~7


      nod:18 (うなずく)方向0~7


      Battle:20 (戦闘情報)方向0~7BattleNo(-1 なら表示消す)SideNoHelpNo(1なら助けを呼ぶCA表示,0なら消す,または無し)
      Leader:21 (リーダー情報)方向0~70:表示消す 1:表示

      Watch:22 (戦闘観戦)方向0~70:表示消す 1:表示

      Turn:30(方向変換)方向0~7


      Warp:31(ワープ)方向0~7


      ACTIONの値は整数で、内容は上の表の左端の項目である。

  • servertoclient CD( string data );
    (CharacterDelete) data はデリミタ(,)で区切られたインデックス。 複数件送る事が出来る。 このIDを持っているキャラクタが消えた時にサーバからクライアントへ と伝わる。 



    if( strcmp( funcname , "CD" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_CD_recv( fd,data); return 0; }

  • servertoclient R( string data );
    (Radar) レーダーの内容をクライアントに送信する。クライアントはこの送信を 要求することはない。サーバーが適当なタイミングで送信する。 たとえば10歩あるくごととか、1分ごととか。

    dataの例:"12|22|E|13|24|P|14|28|P" この文字列はエスケープされない。 



    if( strcmp( funcname , "R" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_R_recv( fd,data); return 0; }

    • string data

    • x ,y, kind ,の順に値を'|'でくぎってならべたものを さらに'|'でならべたもの。 x,yはキャラからの絶対位置。kindは以下にしめす数値ではない 記号。レーダーにうつる物の種類を指定する。送られてくるもの の種類は、それまでに唱えた魔法とか、スキルで変化し、それは サーバーが考える。

      kindの値内容
      E
      Pプレイヤー
      S
      Gお金
      Iアイテム(魂以外)
  • servertoclient S( string data );
    (Status) キャラのステータスを送信する。 データは カテゴリ記号文字(一文字)内容 となっている。つまり最初の 1文字を見れば何のステータスか分る。内容は2文字目からである。 内容は以下のフォーマットにしたがう。たて棒記号'|'がデリミタである。 2個目以降のトークンが内容である。




    if( strcmp( funcname , "S" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_S_recv( fd,data); return 0; }

    • アイテム名は識別レベルで自動的に変更される。

    • 名前2は識別レベルによって、アイテムの能力が入る予定。 クライアントのアイテム欄の2行目に入れる事。

    • ステージは名前の色を替るのに使う。

    • アイテムの説明。

    • アニメ番号は、画像番号。

    • 使用可能場所とは,このアイテムがどこで使用する事が可能かが入っている。 これは,サーバーでは以下のように定義されている。

      			typedef enum  			{  				ITEM_FIELD_ALL,			すべての場所で使える  				ITEM_FIELD_BATTLE,		戦闘中のみ  				ITEM_FIELD_MAP,			通常マップ上のみ    			}

      ITEM_FIELDTYPE; 

    • 使用対象とは,このアイテムを使用することの出来る対象が入っている。 サーバーでは以下のように定義されている。

      			typedef enum  			{  				ITEM_TARGET_MYSELF,		自分のみ  				ITEM_TARGET_OTHER,		他の人(自分含む)  				ITEM_TARGET_ALLMYSIDE,		味方全体  				ITEM_TARGET_ALLOTHERSIDE,	相手側全体  				ITEM_TARGET_ALL,		全て  			}

      ITEM_TARGETTYPE; この数字に100を足すと,死んでいる者も対象となる。

    • アイテムレベル。このレベル以上の者でないと装備出来ない。

    • フラグ類。色んなフラグを送信する。各ビットの対応は以下の通り。

      0bit目ペットメールで送信可能なアイテムかどうか。送信可能だと1。0だと送信できない。
      1Bit目このアイテムが合成出来るかどうか。
      2Bit目このアイテムが料理かどうか。1だと料理である。



    • P 全パラメータ

      kubun hp maxhp mp maxmp str tough exp maxexp exp level attackpower deffencepower fixdex fixcharm fixluck fixfireat fixwaterat fixearthat fixwindat gold 付けている 称号のindex 名前 自己称号 
      デリミタは '|' である。また名前と自己称号は、 エスケープしたものを たて棒でつなげたものが通信される。
      それぞれの値の型は以下。
      kubun に1が入っていると前パラメータを送信, 2以上だと,各ビットの立っているもののパラメータが順番に入って送信されている。 例えば,3が来たらhpとMaxhpがkubun 以降のトークンに納められている。

      kununint
      Hp(体力)hpint
      MaxHpint
      Mp(呪術パワー)int
      MaxMpint
      Vital(体力)int
      Str(腕力)int
      Tough(丈夫さ)int
      Dex(素早さ)int
      Exp(経験値)expint
      MaxExp(次までの経験値)int
      Level(レベル)int
      Attack(攻撃力)int
      Defense(守備力)int
      fQuick(最終素早さ)int
      fCharm(魅力)int
      fLuck(運)int
      fEarth(地)fixearthatint
      fWater(水)int
      fFire(火)int
      fWid(風)fixwindatint
      Gold(お金)int
      称号のindexint
      デュエルポイントint
      名前文字列
      自己称号文字列

      具体例( char の配列そのまま書く )
      P10|20|10|20|10|10|10|1|2|13|13|1|100|10|へんぱ|abc|def 

    • C 座標

      floor maxx maxy x y
      を | で区切って送る。
      具体例( char の配列そのまま書く )
      C1024|100|100|10|20 上記の例では、フロアID1024, サイズ100x100 X 10,Y 20のとこ ろにキャラクターがいるという内容になる。このマイキャラのフ ロアもふくめた座標をクライアントが知ることができるのはこの コマンドのみである。歩きの結果はフロア内の位置しかわからな い。よって、ゲーム開始時、階段使用のとき、ワープのときなど は、このコマンドをつかって正しい値を送信しなくてはならない。 

    • I 全アイテム

      (アイテム1)|(アイテム2)...(アイテムn)
      アイテムの内容は以下の方法でパックする。 ひとつのアイテムは、かならず以下の6つのトークンのセットで 送信される。ひとつひとつの内容は、

      名前|名前2|ステージ|アイテムの説明|アニメ番号|使用可能場所|使用対象|アイテムレベル|フラグ類


      ここの中ではエスケープする。
      具体例( char の配列そのまま書く )
      Iあほ な 子|str+2|1|あほ\|いじ|10|2|0 ステージの値の意味は、整数値で

      1ステージA
      2ステージB
      3ステージC
      4ステージD

      とする。また、アイテム表の空の部分については、5個のトークンが 空で、つまりたて棒がならんだ状態で送信されてくる。 

    • S 全スキル

      (スキル0)|(スキル1)|(スキル2) ... (スキルn)
      称号と同じで、キャラがもてる最大スキル数分を送信する。つま りないものは ||| となるのである。 各エントリの内容は、
      スキルの種類コード|レベル
      である。
      具体例( char の配列そのまま書く )
      S10|2|20|2||| 

    • T 称号

      (称号0)|(称号1)|(称号2) ... (称号n)

      称号のエントリが空の場合は '|' が連続するので、連続したも のを省略してスキャンしてはならない。かならず最大個数分送信 する。
      ひとつ、ひとつの内容は、
      名前
      のみである。
      具体例( 送られてくる char の配列そのままである )
      Tあほ|よっぱらい これもエスケープする。

    • M 部分パラメータ

      キャラクターのステータスのうち、頻繁に変更されるもの(現在 値)とそうでないもの(最大値など)がある。どれかのステータス が変更されるたびに毎回全部のパラメータを送信するのはネット ワークトラフィックを無駄に使うことになるので、特にHP , MP,EXPの値だけにしぼったパラメータ送信コマンドを用意する。 それがこのMコマンドである。2文字目以降の第一トークンはHPの 現在値 , 第二トークンはMP、第三トークンはEXPである。 以下に具体例をしめす。 M54|210|8944909 この例ではHPの現在値が54、MPの現在値が210、経験値が8944909 になっているのだ。この3種類は特に変更頻度が高いと思われる ため独立したコマンド化したが、もちろんこのMコマンドのかわ りにPコマンドで全パラメータを送信してもよい。ただし、最適 にネットワークを使うためには、このコマンドを使うことが推奨 される。 

    • D キャラのID

      ログイン時にだけ送るキャラのindex,それと時間を送る。 D1000|912766409とかで送られる。 

    • E エンカウント確率(下限)|(上限)

      エンカウント率を送信する。確率はn/100
      クライアントは,下限の値からスタートして,1歩歩く毎に+1した確率でエンカウントするかを判断する。 ただし,上限の値を越えないようにする。 次回にこれが送られてくるまでこの確率でエンカウントを計算する事。 

    • J0 ~J6 使える呪術の内容

      使える呪術の内容を送信する。
      0 ~6 はそれぞれアイテムの装備箇所に対応している。一部の装備箇所(頭,胴,手,装飾品) しか装備出来ない予定だが,今後拡張の為に全ての装備箇所の情報を送る
      J0|kubun|mp|field|target|name|comment
      というフォーマットになっている。
      kubun はその欄があるか無いか。0だと無い。それ以降にトークンすらない。1だとある。 mpは消費気力を表す。
      fieldはどの場所で使えるか。サーバーでは以下の様に定義されている。

      		typedef enum  		{  			MAGIC_FIELD_ALL,		すべての場所で使える  			MAGIC_FIELD_BATTLE,		戦闘中のみ  			MAGIC_FIELD_MAP,		通常マップ上のみ  			  		}

      MAGIC_FIELDTYPE; targetはどれを対象に出来るか。サーバーでは以下のように定義されている。

      		typedef enum  		{  			MAGIC_TARGET_MYSELF,		自分のみ  			MAGIC_TARGET_OTHER,		他の人(自分含む)  			MAGIC_TARGET_ALLMYSIDE,		味方全体  			MAGIC_TARGET_ALLOTHERSIDE,	相手側全体  			MAGIC_TARGET_ALL,		全て  			MAGIC_TARGET_NONE,		誰も選択出来ない。防御やための時  			MAGIC_TARGET_OTHERWITHOUTMYSELF,他の人(自分含まない)  			MAGIC_TARGET_WITHOUTMYSELFANDPET, 自分とペット以外  			MAGIC_TARGET_WHOLEOTHERSIDE,    片方のサイド全体  		}

      MAGIC_TARGETTYPE; この数字に100を足すと,死んでいる者も対象となる。

      nameは呪術名。
      commentはこの呪術の説明。


    • N0 ~ N3 仲間のパラメータ

      仲間になっている人の情報を送信する。
      N0|kubun|level|charaindex|maxhp|hp|mp|name 
      kubun はその欄があるか無いか。0だと無い。それ以降にトークンすらない。1全パラメータ。
      2以上だと,各ビットの立っているもののパラメータ(1bit 目 level 2bit 目charaindexなど) が送信される。
      charaindex は仲間のcharaindex
      levelはその人のレベル。
      maxhpはその人のMAXHP
      hpはその人の現在のHP
      mpはその人の気力
      name はその人の名前。


    • K0~K4 恐竜パラメータ

      hp maxhp mp maxmp str tough exp level attackpower deffencepower fixdex fixcharm fixluck fixfireat fixwaterat fixearthat fixwindat 名前 status
      Kの後に0~4を指定して、どの恐竜かを指定すること。 その次のトークンに0が来たらそのペット欄は無いと言う事。 ある場合は1である。1だと全パラメータ。 2以上だと,各ビットの立っているもののパラメータ(1bit 目 hp 2bit 目maxhpなど) が送信される。
      デリミタは '|' である。また名前と自己称号は、 エスケープしたものを たて棒でつなげたものが通信される。
      それぞれの値の型は以下。

      No.(番号)int
      islive(生死)int
      GRA(画像番号)int
      Hp(耐久力)int
      MaxHp(最大耐久力)int
      Mpint
      MapMpint
      Exp(経験値)int
      MaxExp(次までの経験値)int
      Level(レベル)int
      Attack(攻撃力)int
      Defense(守備力)int
      Quick(素早さ)int
      Ai(忠誠度)int
      fEarth(地)int
      fWater(水)int
      fFire(火)int
      fWid(風)int
      Slot(最大石版数)int
      名前変更許可フラグint
      名前文字列
      ユーザーペット名文字列


      名前変更許可フラグとは,このペットの名前を変更してよいかどうかのフラグで, 1 だと変更OK,0だと変更不可となる。



      具体例( char の配列そのまま書く )
      P10|20|10|20|10|10|10|1|2|13|13|1|100|10|へんぱ|PC 

    • W0~W4 ペットの技データ

      W0|skillid|field|target|name|comment| x 7
      W0 ~ W4 はそれぞれのペットに対応している。
      petskillid は,ペットの技の番号。pet_skillinfo.hに定義されている。
      field はその技がどこで使用できるか。サーバーでは以下のように定義されている。

      		typedef enum  		{  			PETSKILL_FIELD_ALL,		すべての場所で使える  			PETSKILL_FIELD_BATTLE,		戦闘中のみ  			PETSKILL_FIELD_MAP,		通常マップ上のみ    		}

      PETSKILL_FIELDTYPE; target はその技の対象がどういうものか。サーバーでは次のように定義されている。

      		typedef enum  		{  			PETSKILL_TARGET_MYSELF,		自分のみ  			PETSKILL_TARGET_OTHER,		他の人(自分含む)  			PETSKILL_TARGET_ALLMYSIDE,	味方全体  			PETSKILL_TARGET_ALLOTHERSIDE,	相手側全体  			PETSKILL_TARGET_ALL,		全て  			PETSKILL_TARGET_NONE,		誰も選択出来ない。防御やための時  			PETSKILL_TARGET_OTHERWITHOUTMYSELF,他の人(自分含まない)   			PETSKILL_TARGET_WITHOUTMYSELFANDPET, 自分とペット以外  		}

      PETSKILL_TARGETTYPE; 
      name は技の名前。
      commentはその技に対する説明。
      target|name|comment| は技の数の分1行で送られてくる。 技は一応7つまで。途中で技が抜けている("|"のみが続く)場合 はクライアントで詰めて表示する事。


  • servertoclient D( int category , int dx , int dy , string data );
    (Display) 画面に何か表示する指令。






    if( strcmp( funcname , "D" ) == 0 ){ int category; int dx; int dy; char* data; category = lssproto_demkstr_int( lssproto.token_list[2] ); dx = lssproto_demkstr_int( lssproto.token_list[3] ); dy = lssproto_demkstr_int( lssproto.token_list[4] ); data = lssproto_wrapStringAddr( lssproto_stringwrapper[4] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[5] )); lssproto_D_recv( fd,category,dx,dy,data); return 0; }

    • int category

    • 何を表示するか。

      内容
      1自分以外に与えたダメージ。dataは文字 列になった値。
      2自分がうけたダメージ。dataは文字列に なった値
    • int dx

    • マイキャラからのグリッド相対位置X。一般的にはイベントが発生 した位置。クライアントはこの値から適宜適切な位置を計算して 描画する。

    • int dy

    • 相対位置Y

    • string data

    • 表示する内容。内容はcategoryによって決まる。 この文字列はエスケープされなければ ならない。

  • servertoclient FS( int flg);
    (FlgSet)PSのの応答。またはログイン時などに自分の状態として送られてくる。





    if( strcmp( funcname , "FS" ) == 0 ){ int flg; flg = lssproto_demkstr_int( lssproto.token_list[2] ); lssproto_FS_recv( fd,flg); return 0; }

    • int flg

    • 0 bit 0: 仲間Off 1: 仲間On
      (現在未使用)1 bit 0: 戦闘途中参加off 1: 戦闘途中参加On 
      2 bit 0: DUEL off 1: DUEL On
      3 bit 0: 普通のチャットモード 1: パーティにしかチャットが飛ばないモード
      4 bit 0: 名刺交換OK 1: 名刺交換拒否

  • servertoclient HL( int flg);
    (HeLp)HLのの応答。またはパーティの仲間が戦闘のお助けモードを変更した場合に送られてくる。





    if( strcmp( funcname , "HL" ) == 0 ){ int flg; flg = lssproto_demkstr_int( lssproto.token_list[2] ); lssproto_HL_recv( fd,flg); return 0; }

    • int flg

    • 0: お助けモードOff 1: お助けモードOn

  • servertoclient PR( int request, int result);
    (PartyRequest)仲間要求の応答。PRをクライアントが送っていなくてもこれを受け取る時がある。 パーティが突然解散(親が抜けた)などの時。 






    if( strcmp( funcname , "PR" ) == 0 ){ int request; int result; request = lssproto_demkstr_int( lssproto.token_list[2] ); result = lssproto_demkstr_int( lssproto.token_list[3] ); lssproto_PR_recv( fd,request,result); return 0; }

    • int request

    • 0: 除隊 1:入隊

    • int result

    • 0: 失敗 1: 成功

  • servertoclient KS( int petarray,int result);
    クライアントのKSに対する返答。これ以外にも必要があれば恐竜のパラメータや メッセージなども送られてくるかもしれない。 または戦闘に出すと選択しているペットがなんらかしらの事情(そのペットを置いたなど)で選択から外れたときにも このメッセージは送られてくる。 





    if( strcmp( funcname , "KS" ) == 0 ){ int petarray; int result; petarray = lssproto_demkstr_int( lssproto.token_list[2] ); result = lssproto_demkstr_int( lssproto.token_list[3] ); lssproto_KS_recv( fd,petarray,result); return 0; }

    • int petarray

    • ペットの番号

    • int result

    • 0: 失敗,または選択ペットから外れた。 1:成功

  • servertoclient PS( int result, int havepetindex, int havepetskill, int toindex);
    (PetSkill use result)ペットの技を使った結果クライアントのPSに対応して送られてくる。 result 以外はクライアントのPSに対応している。フィールド上からしか呼ばれない。



    if( strcmp( funcname , "PS" ) == 0 ){ int result; int havepetindex; int havepetskill; int toindex; result = lssproto_demkstr_int( lssproto.token_list[2] ); havepetindex = lssproto_demkstr_int( lssproto.token_list[3] ); havepetskill = lssproto_demkstr_int( lssproto.token_list[4] ); toindex = lssproto_demkstr_int( lssproto.token_list[5] ); lssproto_PS_recv( fd,result,havepetindex,havepetskill,toindex); return 0; }

    • int result

    • 結果。0: 失敗 1:成功

    • int havepetindex

    • 何番目のペットが使用したか。

    • int havepetskill

    • 何番目の技を使用したか。

    • int toindex

    • 誰に魔法を使用したか。これはオブジェクトやキャラのindexではない。以下の様になっている。

      	  自分    = 0  	  ペット  = 1 ~5  	  仲間    = 6 ~10 (S N の0~4に対応。自分自身も含まれている)

      対象が全員,とか分からない,とかの場合は-1で送信する。

  • servertoclient SKUP( int point );
    (SKillUP) スキルアップができる事をサーバが通知する。いくつ上げられるかを指定する。 



    if( strcmp( funcname , "SKUP" ) == 0 ){ int point; point = lssproto_demkstr_int( lssproto.token_list[2] ); lssproto_SKUP_recv( fd,point); return 0; }

  • servertoclient WN( int windowtype, int buttontype, int seqno, int objindex, string data );
    (Window)
    ウィンドウを表示せよとサーバーがクライアントに通知する。





    if( strcmp( funcname , "WN" ) == 0 ){ int windowtype; int buttontype; int seqno; int objindex; char* data; windowtype = lssproto_demkstr_int( lssproto.token_list[2] ); buttontype = lssproto_demkstr_int( lssproto.token_list[3] ); seqno = lssproto_demkstr_int( lssproto.token_list[4] ); objindex = lssproto_demkstr_int( lssproto.token_list[5] ); data = lssproto_wrapStringAddr( lssproto_stringwrapper[5] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[6] )); lssproto_WN_recv( fd,windowtype,buttontype,seqno,objindex,data); return 0; }

    • int windowtype

    • ウィンドウタイプ。どのような形式のウィンドウを表示するか。これとbuttontype の組み合わせで ウィンドウが決定する。
      サーバーでは以下の様に设置されている。

      		typedef enum  		{  			WINDOW_MESSAGETYPE_MESSAGE,			メッセージのみ  			WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT,		メッセージと一行入力  			WINDOW_MESSAGETYPE_SELECT,			選択ウィンドウ  			WINDOW_MESSAGETYPE_PETSELECT,			ペット選択ウィンドウ  			WINDOW_MESSAGETYPE_PARTYSELECT,			仲間選択ウィンドウ  			WINDOW_MESSAGETYPE_PETANDPARTYSELECT,		ペット,仲間選択ウィンドウ  			WINDOW_MESSAGETYPE_ITEMSHOPMENU,		お店のメニューウインドウ  			WINDOW_MWSSAGETYPE_ITEMSHOPYMAIN,		お店のメインウインドウ  			WINDOW_MESSAGETYPE_LIMITITEMSHOPMAIN,		買い取り専門アイテム屋のメインウインドウ  			WINDOW_MESSAGETYPE_PETSKILLSHOP,		ペットの技屋さんウインドウ  			WINDOW_MESSAGETYPE_WIDEMESSAGE,			メッセージのみ(大きい方)  			WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT,	メッセージと一行入力(大きい方)    		}

      WINDOW_MESSAGETYPE;

    • int buttontype

    • ボタンの形式を指定する。サーバーでは以下の用に定義されている。

      		#define		WINDOW_BUTTONTYPE_NONE		(0)  		#define		WINDOW_BUTTONTYPE_OK		(1 << 0)  		#define		WINDOW_BUTTONTYPE_CANCEL	(1 << 1)  		#define		WINDOW_BUTTONTYPE_YES		(1 << 2)  		#define		WINDOW_BUTTONTYPE_NO		(1 << 3)  		#define		WINDOW_BUTTONTYPE_PREV		(1 << 4)  		#define		WINDOW_BUTTONTYPE_NEXT		(1 << 5)

      これらの組み合わせで送信する。例えば,YESボタンとNOボタンが欲しい時は
      WINDOW_BUTTONTYPE_YES | WINDOW_BUTTONTYPE_NO (=12)
      で送る。

    • int seqno

    • このウィンドウの番号を示す。サーバーが管理する。 クライアントはWNにてこのウィンドウの操作結果を返すのに,この番号を添えて返答する。 これによってサーバーはどのNPCのどの場面でのウィンドウかを判断出来るようにする。

    • int objindex

    • このウィンドウを出せと言ったNPCなどのindexが格納されている。 システムが出せと言った場合は-1などが入っている。 クライアントは,ウィンドウ入力後のWNプロトコルでこの数値をそのまま返せば良い。

    • string data

    • メッセージ内容を示す。内容はエスケープする。"\n"で区切ると改行という意味とする。 また,クライアントのウィンドウで表示出来る横幅を越えた際は自動的に改行される。 選択肢のあるウィンドウでは,"\n"で区切られた最初のトークンがメッセージの行数 となり,次にメッセージのトークンが最初のトークンで指定された個数続き, そのあとのトークン毎が1つずつの選択肢となる。また前から順に 1 から 番号を割り当て,選択した場合のWNでの返答の時に返す。

    • string data(お店用)

    • メッセージ内容を示す。内容はエスケープする。"\n"で区切ると改行という意味とする。 また,クライアントのウィンドウで表示出来る横幅を越えた際は自動的に改行される。 データ内は項目毎に"|"で区切られています。 

    • ?買う?
      買い売るフラグ(買う0:売る1)|前のデータ使うかフラグ(使う0:使わない:1)| 店の名前|メッセージ|店メッセージ|個数選択メッセージ|レベル足りないメッセージ|确定メッセージ| アイテムがいっぱいメッセージ|アイテム名|買える買えないフラグ(買える:0買えない:1)|アイテムレベル| 値段|画像番号|説明|アイテム名|買える買えないフラグ|アイテムレベル|値段|画像番号|説明 

      0|1|サムギルの武器屋|いらっしゃい、何のようだい|いらっしゃいどれにする|何個必要だい|それを装備するにはレベルが 足りないけどいいのかい|本当にいいんだね|おいおいアイテムがいっぱいじゃねえか!|ブーメラン| 0|100|16000|横一列に攻撃\n効果抜群|薬草|0|50|16002|HP20回復\n冒険にはつき物\n安い| 


    • ?売る?
      買い売るフラグ(買う0:売る1)|前のデータ使うかフラグ(使う0:使わない:1)| 店の名前|メッセージ|店メッセージ|お金がいっぱいになっちゃうメッセージ|确定メッセージ| アイテム名|売れる売れないフラグ|値段|画像番号|説明|アイテム名|売れる売れないフラグ| 値段|画像番号|説明| 

      1|1|サムギルの道具屋|いらっしゃい、どるする?|いらっしゃいどれを売ってくれる。|本当にいいんだね| それだと、お金がオーバーしちゃうね|ブーメラン|0|20|16000| 横一列に攻撃\n効果抜群|薬草|0|10|16002|HP20回復\n冒険にはつき物\n安い| 


    • ?その他?
      店の名前|メッセージ 

      サムギルの道具屋|いらっしゃい、どるする? 


    • string data(ペットの技屋さん用)

    • メッセージ内容を示す。内容はエスケープする。"\n"で区切ると改行という意味とする。 また,クライアントのウィンドウで表示出来る横幅を越えた際は自動的に改行される。 データ内は項目毎に"|"で区切られています。 

    • ?ペットの技取得?
      前の情報使うかどうか?(使う:0 使わない:1)|店の名前|メインメッセージ| 技名|値段|技説明|技名|値段|技説明 

      1|サムギルの武器屋|いらっしゃいまっせ。すばらしい技ばっかですよ| 背水の陣その①|500|攻撃力30%UP 防御力30%DOWN| 地球一週|1000|新しい発見があるかも(適当)|

  • servertoclient ClientLogin(string result);
    ClientLoginの返答。 





    if( strcmp( funcname , "EF" ) == 0 ){ int effect; int level; char* option; effect = lssproto_demkstr_int( lssproto.token_list[2] ); level = lssproto_demkstr_int( lssproto.token_list[3] ); option = lssproto_wrapStringAddr( lssproto_stringwrapper[3] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[4] )); lssproto_EF_recv( fd,effect,level,option); return 0; }

    • string result

    • "ok" という文字列。この文字列はエスケープされない。

  • servertoclient SE( int x, int y, int senumber, int sw );
    (SoundEffect)
    ???????SE???????????????





    if( strcmp( funcname , "SE" ) == 0 ){ int x; int y; int senumber; int sw; x = lssproto_demkstr_int( lssproto.token_list[2] ); y = lssproto_demkstr_int( lssproto.token_list[3] ); senumber = lssproto_demkstr_int( lssproto.token_list[4] ); sw = lssproto_demkstr_int( lssproto.token_list[5] ); lssproto_SE_recv( fd,x,y,senumber,sw); return 0; }

    • 0:????

    • 1:????

    • int x,y

    • SE??D????????

    • int senumber

    • ????k?

    • int sw

    • ??????????????

  • servertoclient ClientLogin(string result);
    ClientLogin????? 





    if( strcmp( funcname , "ClientLogin" ) == 0 ){ char* result; result = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_ClientLogin_recv( fd,result); return 0; }

    • string result

    • "ok" ?????????????????????????

  • servertoclient CreateNewChar(string result,string data);
    CreateNewCharの返答。 





    if( strcmp( funcname , "CreateNewChar" ) == 0 ){ char* result; char* data; result = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_CreateNewChar_recv( fd,result,data); return 0; }

    • string result

    • "successful" か "failed" のいずれか。この文字列はエスケー プしない。

    • string data

    • "failed" の時は理由を示す人間の見て分る文字 列である。アカウントサーバからの返答そのままである。 以下の文字列

      	    "failed bad parameter"

      の場合は、キャラ作成のときに規定のパラメータの範囲を越えて いるというとを意味する。これはゲームサーバーが出力するメッ セージである。この文字列はエスケープしない。

  • servertoclient CharDelete(string result,string data);
    CharDelete の返答。 





    if( strcmp( funcname , "CharDelete" ) == 0 ){ char* result; char* data; result = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_CharDelete_recv( fd,result,data); return 0; }

    • string result

    • "successful" か "failed" のいずれか。エスケープしない。

    • string data

    • "failed" の時は理由を示す人間の見て分る文字 列である。アカウントサーバからの返答そのままである。 デリミタをふくまないので、エスケープしない。

  • servertoclient CharLogin(string result,string data);
    CharaLoginの返答。 





    if( strcmp( funcname , "CharLogin" ) == 0 ){ char* result; char* data; result = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_CharLogin_recv( fd,result,data); return 0; }

    • string result

    • "successful" か "failed" のいずれか。エスケープしない。

    • string data

    • "failed" の時は その理由の文字列。エスケープしない。

  • servertoclient CharList(string result,string data);
    CharListの返答。 





    if( strcmp( funcname , "CharList" ) == 0 ){ char* result; char* data; result = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_CharList_recv( fd,result,data); return 0; }

    • dataplace

    • セーブデータの何番目か。これでキャラクターリストの何番目かを決定する。

    • faceimage

    • 顔の画像番号

    • level

    • キャラのレベル

    • maxhp,atk,def,quick,charm

    • 各パラメータ。

    • earth.water,fire,wind

    • 各属性値

    • logincount

    • ログインカウント

    • name

    • キャラの名前

    • place

    • キャラのいる場所

    • string result

    • "successful" か "failed" のいずれか。エスケープしない

    • string data

    • resultが"successful"の時は、アカウントサーバーに保存されて いるすべてのキャラの名前、オプションををスペースで区切った 一個の文字列。この文字列を作っているのは、アカウントサーバ。 result が "failed" の時は理由を示す人間の見て分る文字列で ある。成功の時のオプションの中身は以下のとおりである。
      dataplace|faceimage|level|maxhp|atk|def|quick|charm|earth|water|fire|wind|logincount|name|place
      "|" で区切られている。 それぞれの項目は、エスケープされている。そのあとたて棒 でつなげる。

  • servertoclient CharLogout(string result , string data);
    Logoutに対する返答。 





    if( strcmp( funcname , "CharLogout" ) == 0 ){ char* result; char* data; result = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_CharLogout_recv( fd,result,data); return 0; }

    • string result

    • "successful" か "failed" のいずれか。エスケープしない。

    • string data

    • "failed" の時にのみ意味があり、失敗の理由(状態)を示す人間 の見て分る文字列である。エスケープしない。

  • servertoclient ProcGet( string data);
    ProcGetの返答。 





    if( strcmp( funcname , "ProcGet" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_ProcGet_recv( fd,data); return 0; }

    • string data

    • エスケープする。ゲームサーバーの内部情報を送信する。内容はlog/procファイルに書かれる内容と同じ。

  • servertoclient PlayerNumGet( int logincount, int player);
    PlayerNumGetの返答。 





    if( strcmp( funcname , "PlayerNumGet" ) == 0 ){ int logincount; int player; logincount = lssproto_demkstr_int( lssproto.token_list[2] ); player = lssproto_demkstr_int( lssproto.token_list[3] ); lssproto_PlayerNumGet_recv( fd,logincount,player); return 0; }

    • int logincount,player


  • servertoclient Echo( string test );
    Echoに対する返答。



    if( strcmp( funcname , "Echo" ) == 0 ){ char* test; test = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_Echo_recv( fd,test); return 0; } //------------------------------------------------------- // Add Command Count // Robin 2001/04/06 //------------------------------------------------------- if( strcmp( funcname , "NU" ) == 0 ){ int AddCount; AddCount = lssproto_demkstr_int( lssproto.token_list[2] ); lssproto_NU_recv( fd, AddCount); return 0; } // Robin 04/12 trade if( strcmp( funcname , "TD" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[2] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[3] )); lssproto_TD_recv( fd, data); return 0; } // Robin 0529 family if( strcmp( funcname , "FM" ) == 0 ){ char* data; data = lssproto_wrapStringAddr( lssproto_stringwrapper[1] , lssproto.workbufsize , lssproto_demkstr_string( lssproto.token_list[2] )); lssproto_FM_recv( fd, data); //lssproto_FM_recv( fd, lssproto_stringwrapper[0] ); return 0; } return -1; }

    void lssproto_SetClientLogFiles( char *r , char *w )  {  	lssproto_strcpysafe( lssproto_readlogfilename , r , sizeof( lssproto_readlogfilename ) );  	lssproto_strcpysafe( lssproto_writelogfilename , w , sizeof( lssproto_writelogfilename ) );  }

    int lssproto_InitClient( int (*writefunc)(int,char*,int) ,int bufsiz ,int fd) { int i; if( (void*)writefunc == NULL){lssproto.write_func = lssproto_default_write_wrap;} else {lssproto.write_func = writefunc;} lssproto_AllocateCommonWork(bufsiz); lssproto_stringwrapper = (char**)MALLOC(sizeof(char*) * MAXLSRPCARGS); if(lssproto_stringwrapper ==NULL)return -1; memset( lssproto_stringwrapper , 0, sizeof(char*)*MAXLSRPCARGS); for(i=0;i<maxlsrpcargs;i++){ lssproto_stringwrapper[i]="(char*)MALLOC(" bufsiz="" );="" if(="" null){="" for(i="0;i<MAXLSRPCARGS;i++){FREE(" lssproto_stringwrapper[i]);return="" -1;}

    <="" pre=""> } } return 0; }

    void lssproto_CleanupClient( void )  {  	int i;  	FREE( lssproto.work );  	lssproto.work = NULL;  	FREE( lssproto.arraywork);  	lssproto.arraywork = NULL;  	FREE( lssproto.escapework );  	lssproto.escapework = NULL;  	FREE( lssproto.val_str);  	lssproto.val_str = NULL;  	FREE( lssproto.token_list );  	lssproto.token_list = NULL;  	FREE( lssproto.cryptwork );  	lssproto.cryptwork = NULL;  	FREE( lssproto.jencodecopy );  	lssproto.jencodecopy = NULL;  	FREE( lssproto.jencodeout );  	lssproto.jencodeout = NULL;  	FREE( lssproto.compresswork );  	lssproto.compresswork = NULL;  	for(i=0;i<maxlsrpcargs;i++) {="" free(="" lssproto_stringwrapper[i]);="" lssproto_stringwrapper[i]="NULL;" }  	FREE( lssproto_stringwrapper );  	lssproto_stringwrapper = NULL;  }
    • string test

    • さきほど入力された文字列。エスケープしない。


发表评论: