-
Notifications
You must be signed in to change notification settings - Fork 0
Socket Server API
- ソケット通信には名前空間を用いています。
- Lobbyへアクセスするにはクライアントから
socket = io.connect(server)
とします。 - Roomへアクセスするには後述のadd_userとroomを用いてRoomIDを取得し、
socket = io.connect(server + "/" + RoomID)
とします。 - 1つの名前空間(ここではRoom)に入れる人数の制限とゲーム開始時にRoomにロックを掛けることができます。
- 各Roomはサーバサイドのメモリ上に保存されるため、サーバを停止させるとRoomデータは消えます。
- 名前空間によって使用するAPIが異なるのでAPIの前に括弧書きで名前空間を明記します。
- サーバに情報を送信する際に用いるAPIです。
-
socket.emit(name, data)
で送信します。 - dataは必ずObjectです。
-
*
は必須項目で、存在しない場合はエラーを返します。
ユーザ名等のユーザ情報を設定します。サーバのメモリ上に保存されます。 ユーザとのコネクションが切断されると消されます。
{
name: 名前 *
}
メッセージを送信します。サーバには保存されません。
{
msg: メッセージ *
}
typeにactivityのタイプを指定し、他のパラメータは自由に設定します。サーバのメモリ上に保存されます。 add_userと同じ変数に格納され、同様にコネクションが切断されると消されます。
{
type: move or attack or build *,
*: *
}
- サーバに情報を受信する際に用いるAPIです。
-
socket.on(name, function (data) {処理})
で受信します。 - dataは必ずObjectで渡されます。
エラー情報が送られてきます。
{
msg: エラーメッセージ
}
add_userを呼び出した際にRoomIDが送られてきます。
{
id: RoomID // UserIDと同じ生成方法で16桁のID
}
初期化情報が送られてきます。 自分のユーザ情報が含まれています。
{
id: '1327225639042097', // UserID …16桁のID(String型の一意な数字)
name: null,
timestamp: 1327225639042 // UNIX Time[ms]
}
ユーザ情報に変更があった場合、または他のユーザがuser_activityに送信した場合にその情報をブロードキャストします。
{
id: UserID,
name: null,
type: move or attack or build *,
*: *
}
####クライアントからサーバに送るリクエスト:寿司を取ったユーザから送信された以下の情報を受診
{
turn : [現在のターン数],
sushi_order_id : [そのターンで送った何番目の寿司番号かの情報],
user_id : [寿司とった人のユーザID], eaten_time : [寿司とった時刻]
}
このリクエストは、寿司をクリックした人全員からとりあえず送信される。
サーバ側では、受け取った全てのリクエストから、eaten_time を比較し、最も速く寿司を取った人を決定する処理を行うものとする。
寿司をまったくクリックしなかった場合、そのユーザはデータを送付しないため、データを送付しなかったユーザが誰か確認を行い、当てはまったユーザは寿司を見逃したとみなす。
※ ちなみに、このプロトコル仕様で送られる eaten_time では、クライアントマシンの時刻設定の変更により、 不正行為を行える可能性がある。
不正行為を防止するためにサーバ側では、現在行ったターンの開始時刻を保持しておき、 クライアントから受け取った時刻情報と比較。
プラマイ30秒ほどのリクエストのみを正常に処理するよう実装を行うこと。
(この不正行為防止部分、プライオリティは低めに設定してください)
####サーバからクライアントに戻すレスポンス:プレイしてる全ユーザに対しブロードキャストで以下の情報を送信
{
{
sushi_eaten_user_id : [寿司とった人のuser_id],
turn : [寿司を取ったターン数],
sushi_order_id : [寿司を取ったターンで送った、何番目の寿司番号かの情報 (ここに含めて大丈夫かな?)],
},
{
{ user_id : [ユーザID その1], total_price : [合計金額] },
{ user_id : [ユーザID その2], total_price : [合計金額]},
{...ゲームに参加しているユーザの人数分、構造が同じデータを作成... }
}
}
レスポンスを受け取ったクライアント側では、sushi_eaten_user_id で送られた user_id と一致するユーザの頭上に○、 それ以外のユーザの頭上には×を表示するようにする。(とりあえず)
また、2番目のデータ構造に含まれる合計金額情報を元に、自分以外のユーザの現在の合計金額を表示する。 また、クライアント側に保持している予算を越えたユーザは、クライアント側で脱落(ゲームオーバー)させるようにする。
あ、3回連続で寿司を取らずに脱落(ゲームオーバー)させたいユーザ情報はどうやって伝えようかなぁ? たけさん、みぃおさん、このレスポンスにうまいこと情報を含めてみてください (・∀・)
上記の仕様はなくなるかもしれません。
「1ルーム内で一番パスした人とパスしてない人の差でドボンさせたらどうか?」という仕様になるかも。