Created
October 19, 2010 12:51
-
-
Save arch-jslin/634137 to your computer and use it in GitHub Desktop.
guess_server_script.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// env, kit 為 server 暴露給開發者用的功能物件 | |
var sys = kit.sys; // 服務管理工具 | |
var game = kit.game; // 遊戲邏輯工具 | |
var db = kit.db; // 資料永續儲存介面 | |
var mem = kit.sharedmem; // shared variable, 跨多個 logic files | |
var data_ = {}; // user defined local variable | |
/* | |
* 1. 覆寫遊戲服務的管理事件, 如 start, stop 等, 沒寫的話 server 會用內建版本 | |
*/ | |
sys.on('loop', function(){ | |
// server 定期、反覆執行此函式 | |
kit.say('現在是 tick' + mem.t++); | |
}); | |
sys.on('start', function(){ | |
// ...服務啟動時... | |
}); | |
sys.on('stop', function(){ | |
// ...停止服務時... | |
}); | |
/* | |
* 2. 自定義的遊戲邏輯事件 | |
* 參數1: message header | |
* 參數2: handler | |
*/ | |
game.on('INIT', function(data){ // 遊戲啟動時, 資料初始化一次 | |
mem.plist = {}; // 玩家列表 | |
mem.upperbound = data.upperbound; //初始化遊戲資料1 | |
mem.lowerbound = data.lowerbound; //初始化遊戲資料2 | |
mem.userlimit = data.userlimit; | |
mem.gameStarted = false; // 遊戲開始與否 | |
mem.t = 0; // 遊戲時間 | |
data_.player_answer_count = 0; | |
}); | |
game.on('PLAYER_JOIN', function(data){ // 玩家加入, 參考資料存在 data | |
kit.say('player '+data.email+' wants to join.'); | |
// 遊戲已經開始, 或人已經滿了,不給加 | |
if (mem.gameStarted || count(mem.plist) >= data.userlimit) | |
return; | |
var eml = data.email; | |
var info = data.info; | |
if (count(mem.plist) < data.userlimit) | |
mem.plist[eml] = info; | |
if( count(mem.plist) === data.userlimit ) { | |
kit.say('game room is full, notifying all players.'); | |
mem.gameStarted = true; | |
// 發訊息給 plist 上所有人。GAME_START 是應該定義在 client side 的 handler | |
for ( player in mem.plist ) { | |
kit.say_to(player, 'GAME_START', /* send data respectively to each players */); | |
} | |
} | |
}); | |
game.on('PLAYER_ANSWER', function(data){ //玩家設定自己的答案 | |
if( mem.plist[data.email].answer === undefined ) { | |
mem.plist[data.email].answer = data.answer; | |
++data_.player_answer_count; | |
} | |
if( data_.player_answer_count === count(mem.plist) ) { | |
var p = random(mem.plist); | |
kit.say_to(p, 'TURN_START'); | |
data_.whos_turn = p; | |
} | |
}); | |
game.on('PLAYER_GUESS', function(data){ //玩家猜對方的答案 | |
if( data_.whos_turn.info !== data.info ) //不確定是否該這樣寫,總之作驗證 | |
return; | |
if( data.guess > mem.upperbound ) return; //驗證猜測是否在原本上下限裡 | |
if( data.guess < mem.lowerbound ) return; | |
var winner; | |
if( data.guess > mem.plist[data.opponent.email].answer ) { | |
kit.say_to(data_.whos_turn, 'TOO_BIG'); | |
} | |
else if( data.guess < mem.plist[data.opponent.email].answer ) { | |
kit.say_to(data_.whos_turn, 'TOO_SMALL'); | |
} | |
else { | |
winner = data_.whos_turn; | |
for( player in mem.plist ) { | |
kit.say_to(player, 'WIN', winner); | |
} | |
// Some cleanup here maybe? | |
} | |
if( winner === undefined ) { // No winner yet | |
kit.say_to(data.opponent, 'TURN_START'); | |
data_.whos_turn = data.opponent; | |
} | |
}); | |
/* ... */ | |
game.on('PLAYER_QUIT', function(data){ // 玩家離開, 參考資料存在 data | |
// 其他必須要做的清理 ... | |
delete mem.plist[data.email]; | |
mem.gameStarted = false; | |
// 重新讓 game logic 回到待命狀態,等待玩家加入 | |
}); | |
/* ... */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment