diff options
Diffstat (limited to 'webapp/swiftstory-common.js')
-rw-r--r-- | webapp/swiftstory-common.js | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/webapp/swiftstory-common.js b/webapp/swiftstory-common.js new file mode 100644 index 0000000..174b473 --- /dev/null +++ b/webapp/swiftstory-common.js @@ -0,0 +1,348 @@ +var SwiftStory = function() { + this.on_socket_open = function() { /* to override */ }; + this.on_socket_close = function() { /* to override */ }; + this.on_socket_error = function(evt) { /* to override */}; + + this.on_join_game_ok = function(state) { /* to override */ }; + this.on_show_white_card = function(idx, desc) { /* to override */ }; + this.on_pick_black_card_ok = function() { /* to override */ }; + this.on_show_black_card = function(desc) { /* to override */ }; + this.on_play_white_card_ok = function(idx) { /* to override */ }; + this.on_collect_cards_ok = function() { /* to override */ }; + this.on_show_played_card = function(idx, desc) { /* to override */ }; + this.on_designate_card_ok = function(idx) { /* to override */ }; + + this.on_judge_needed = function() { /* to override */ }; + this.on_judge_designed = function() { /* to override */ }; + this.on_player_joined_game = function() { /* to override */ }; + this.on_card_played = function() { /* to override */ }; + this.on_cards_collected = function() { /* to override */ }; + this.on_updated_score = function(new_score) { /* to override */ }; + this.on_change_state = function(state) { /* to override */ }; + this.on_change_nbr_played_cards = function(nbr) { /* to override */ }; + + var request_queue = []; + + var judge = false; + + var self = this; + var ws; + + var lang; + + var nbr_played_cards = 0; + + var played_cards = []; + var white_cards = {}; + var black_card; + + var score = 0; + + var map_handle_response_ok = {}; + var map_handle_notif = {}; + + this.set_lang = function(language) { + lang = language; + }; + + this.is_judge = function() { + return judge; + }; + + this.reset_nbr_played_cards = function() { + nbr_played_cards = 0; + + self.on_change_nbr_played_cards(nbr_played_cards); + }; + + this.incr_nbr_played_cards = function() { + ++nbr_played_cards; + + self.on_change_nbr_played_cards(nbr_played_cards); + }; + + this.get_white_card_event = function(idx) { + return white_cards[idx]['event']; + }; + + this.get_played_card_event = function(idx) { + return played_cards[idx]['event']; + }; + + this.change_state = function(state) { + game_state = state; + + switch (state) { + case 'waiting_judge': + played_cards = []; + self.reset_nbr_played_cards(); + judge = false; + + self.on_judge_needed(); + + break; + case 'waiting_collection': + break; + case 'waiting_designation': + break; + } + + this.on_change_state(state); + }; + + /* map_handle_response_ok {{{ */ + + map_handle_response_ok['join_game'] = function(result) { + self.on_join_game_ok(); + + self.change_state(result['game_state']); + + map_handle_response_ok['view_player_cards'](result); + }; + + map_handle_response_ok['view_player_cards'] = function(result) { + for (var i in result['cards']) { + var idx = result['cards'][i][0]; + var desc = result['cards'][i][1]; + + white_cards[idx] = { + 'desc': desc, + 'event': self.gen_callback_white_card(idx) + }; + + self.on_show_white_card(idx, desc) + } + }; + + map_handle_response_ok['pick_black_card'] = function(result) { + judge = true; + self.change_state('waiting_collection'); + + self.on_pick_black_card_ok(); + map_handle_response_ok['view_black_card'](result); + }; + + map_handle_response_ok['view_black_card'] = function(result) { + black_card = result; + self.on_show_black_card(black_card); + }; + + map_handle_response_ok['play_white_card'] = function(result) { + idx = result['card_id']; + + self.on_play_white_card_ok(idx); + + delete white_cards[idx]; + }; + + map_handle_response_ok['collect_cards'] = function(result) { + self.change_state('waiting_designation'); + + self.on_collect_cards_ok(); + map_handle_response_ok['view_played_cards'](result); + }; + + map_handle_response_ok['view_played_cards'] = function(result) { + for (var i in result) { + var desc = result[i]; + + played_cards.push({ + 'desc': desc, + 'event': self.gen_callback_played_card(i), + }); + self.on_show_played_card(i, desc); + } + + if (!result.length) { + self.gen_callback_played_card(null)(); + } + }; + + map_handle_response_ok['designate_card'] = function(result) { + self.change_state('waiting_judge'); + + self.on_designate_card_ok(); + }; + + /* }}} */ + /* handle_notif {{{ */ + + map_handle_notif['judge_designed'] = function(result) { + self.change_state('waiting_collection'); + + self.on_judge_designed(); + }; + + map_handle_notif['received_card'] = function(result) { + var idx = result['card']['id']; + var desc = result['card']['desc']; + + white_cards[idx] = { + 'desc': desc, + 'event': self.gen_callback_white_card(idx) + }; + + self.on_show_white_card(idx, desc); + }; + + map_handle_notif['judge_needed'] = function(result) { + self.change_state('waiting_judge'); + }; + + map_handle_notif['player_joined_game'] = function(result) { + self.on_player_joined_game(); + }; + + map_handle_notif['card_played'] = function(result) { + self.incr_nbr_played_cards(); + + self.on_card_played(); + }; + + map_handle_notif['cards_collected'] = function(result) { + self.change_state('waiting_designation'); + + self.on_cards_collected(); + }; + + map_handle_notif['updated_score'] = function(result) { + self.score = result; + + self.on_updated_score(self.score); + }; + + /* }}} */ + + this.run = function() { + ws = new WebSocket('ws://' + document.location.hostname + ':1236'); + + ws.onopen = function() { + console.log('connection established'); + self.on_socket_open(); + }; + + ws.onclose = function() { + self.on_socket_close(); + }; + + ws.onmessage = function(evt) { + var message = JSON.parse(evt.data); + + if (message['type'] == 'notification') { + handle_notif(message['content']); + } else { + handle_response(message['content']); + } + }; + + ws.onerror = function(evt) { + console.log(evt); + self.on_socket_error(evt); + }; + + }; + + var handle_notif = function(notif) { + if (map_handle_notif[notif['op']]) { + map_handle_notif[notif['op']](notif['content']); + } else { + console.log('unhandled notif ' + notif); + } + }; + + var handle_response = function(response) { + var rq = request_queue.shift(); + + if (response['status'] != 0) { + alert(response['info']); + return; + } + + if (map_handle_response_ok[rq]) { + map_handle_response_ok[rq](response['result']) + } else { + console.log(evt); + } + }; + + this.gen_callback_white_card = function(index) { + return function() { + var request = { + 'op': 'play_white_card', + 'card_id': index, + }; + + request_queue.push('play_white_card'); + ws.send(JSON.stringify(request)); + }; + }; + + this.gen_callback_played_card = function(index) { + return function() { + var request = { + 'op': 'designate_card', + 'card_id': index, + }; + + request_queue.push('designate_card'); + ws.send(JSON.stringify(request)); + }; + }; + + this.join_game = function(game_name) { + var request = { + 'op': 'join_game', + 'game_name': game_name, + 'lang': lang, + }; + request_queue.push('join_game'); + ws.send(JSON.stringify(request)); + }; + + this.pick_black_card = function() { + var request = { + 'op': 'pick_black_card', + }; + request_queue.push('pick_black_card'); + ws.send(JSON.stringify(request)); + }; + + this.collect_cards = function() { + var request = { + 'op': 'collect_cards', + }; + request_queue.push('collect_cards'); + ws.send(JSON.stringify(request)); + }; + + this.request_show_cards = function() { + var request = { + 'op': 'view_player_cards', + }; + + request_queue.push('view_player_cards'); + ws.send(JSON.stringify(request)); + }; + this.request_show_black_card = function() { + var request = { + 'op': 'view_black_card', + }; + + request_queue.push('view_black_card'); + ws.send(JSON.stringify(request)); + }; + this.request_show_played_cards = function() { + var request = { + 'op': 'view_played_cards', + }; + + request_queue.push('view_played_cards'); + ws.send(JSON.stringify(request)); + }; +}; + +var swst; + +$(document).ready(function() { + swst = new SwiftStory(); +}); |