Commit 58ca63d1 authored by 神楽坂玲奈's avatar 神楽坂玲奈

11.7

parent 59421bd9
{ {
"ip": "112.124.4.110", "ip": "112.124.4.110",
"port": 7911, "port": 7911,
"http_port": 7922, "version": 4896,
"version": 4896 "modules": {
"welcome": "Mycard MatchServer\n这里是测试中的新服务器, 还不稳定, 随时可能崩溃, 遇到意外请淡定",
"tips": "https://my-card.in/tips.json",
"dialogues": "https://my-card.in/dialogues.json",
"database": "mongodb://phoenix.my-card.in/mycard",
"post_start_watching": false,
"skip_empty_side": true,
"http": {
"port": 7922,
"match": true
}
}
} }
\ No newline at end of file
settings = require './config.json'
mongoose = require 'mongoose'
Deck = mongoose.model 'Deck',
name: String
card_usages: [{
card_id: Number,
side: Boolean,
count: Number
}],
user: mongoose.Schema.ObjectId
created_at: { type: Date, default: Date.now },
used_count: Number,
last_used_at: Date
module.exports = Deck
\ No newline at end of file
// Generated by CoffeeScript 1.6.3
(function() {
var Deck, mongoose, settings;
settings = require('./config.json');
mongoose = require('mongoose');
Deck = mongoose.model('Deck', {
name: String,
card_usages: [
{
card_id: Number,
side: Boolean,
count: Number
}
],
user: mongoose.Schema.ObjectId,
created_at: {
type: Date,
"default": Date.now
},
used_count: Number,
last_used_at: Date
});
module.exports = Deck;
}).call(this);
/*
//@ sourceMappingURL=deck.map
*/
{
"version": 3,
"file": "deck.js",
"sourceRoot": "",
"sources": [
"deck.coffee"
],
"names": [],
"mappings": ";AAAA;CAAA,KAAA,kBAAA;;CAAA,CAAA,CAAW,IAAA,CAAX,OAAW;;CAAX,CAEA,CAAW,IAAA,CAAX,EAAW;;CAFX,CAGA,CAAO,CAAP,CAAO,CAAA,EAAQ;CACb,CAAM,EAAN,EAAA;CAAA,CACa,EAAb,OAAA;OAAc;CAAA,CACH,IADG,CACZ,CAAA;CADY,CAEN,EAAN,GAFY,CAEZ;CAFY,CAGL,GAAP,CAHY,EAGZ;QAHW;MADb;CAAA,CAMM,EAAN,EAAqB,EAAP;CANd,CAOY,EAAZ,MAAA;CAAY,CAAQ,EAAN,EAAA;CAAF,CAAuB,CAAvB,CAA2B,EAAb,GAAA;MAP1B;CAAA,CAQY,EAAZ,EARA,IAQA;CARA,CASc,EAAd,QAAA;CAbF,GAGO;;CAHP,CAeA,CAAiB,CAfjB,EAeM,CAAN;CAfA"
}
\ No newline at end of file
[-10,20,50,100,180,300,450,650,1000,1400,2000,3000]
\ No newline at end of file
settings = require './config.json'
mongoose = require 'mongoose'
Match = mongoose.model 'Match',
players: [{
user: mongoose.Schema.ObjectId,
deck: mongoose.Schema.ObjectId,
}],
duels: [{
winner: Number
reason: Number
}],
winner: mongoose.Schema.ObjectId,
created_at: { type: Date, default: Date.now },
ygopro_version: Number
module.exports = Match
\ No newline at end of file
// Generated by CoffeeScript 1.6.3
(function() {
var Match, mongoose, settings;
settings = require('./config.json');
mongoose = require('mongoose');
Match = mongoose.model('Match', {
players: [
{
user: mongoose.Schema.ObjectId,
deck: mongoose.Schema.ObjectId
}
],
duels: [
{
winner: Number,
reason: Number
}
],
winner: mongoose.Schema.ObjectId,
created_at: {
type: Date,
"default": Date.now
},
ygopro_version: Number
});
module.exports = Match;
}).call(this);
/*
//@ sourceMappingURL=match.map
*/
{
"version": 3,
"file": "match.js",
"sourceRoot": "",
"sources": [
"match.coffee"
],
"names": [],
"mappings": ";AAAA;CAAA,KAAA,mBAAA;;CAAA,CAAA,CAAW,IAAA,CAAX,OAAW;;CAAX,CAEA,CAAW,IAAA,CAAX,EAAW;;CAFX,CAGA,CAAQ,EAAR,EAAQ,CAAQ;CACd,CAAS,EAAT,GAAA;OAAU;CAAA,CACF,EAAN,EAAqB,EAArB;CADQ,CAEF,EAAN,EAAqB,EAArB;QAFO;MAAT;CAAA,CAIO,EAAP,CAAA;OAAQ;CAAA,CACE,IAAR,EAAA;CADM,CAEE,IAAR,EAAA;QAFK;MAJP;CAAA,CAQQ,EAAR,EAAA,EAAgB;CARhB,CASY,EAAZ,MAAA;CAAY,CAAQ,EAAN,EAAA;CAAF,CAAuB,CAAvB,CAA2B,EAAb,GAAA;MAT1B;CAAA,CAUgB,EAAhB,EAVA,QAUA;CAdF,GAGQ;;CAHR,CAgBA,CAAiB,EAhBjB,CAgBM,CAAN;CAhBA"
}
\ No newline at end of file
request = require 'request'
@key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_="
@load_card_usages_from_cards = (main, side)->
result = []
last_id = null
for card_id in main
if card_id == last_id
count++
else
result.push {card_id: last_id, side: false, count: count} if last_id
last_id = card_id
count = 1
result.push {card_id: last_id, side: false, count: count} if last_id
last_id = null
for card_id in side
if card_id == last_id
count++
else
result.push {card_id: last_id, side: true, count: count} if last_id
last_id = card_id
count = 1
result.push {card_id: last_id, side: true, count: count} if last_id
result
@encode = (card_usages)->
result = ''
for card_usage in card_usages
c = card_usage.side << 29 | card_usage.count << 27 | card_usage.card_id
for i in [4..0]
result += @key.charAt((c >> i * 6) & 0x3F)
result
@deck_url = (name, card_usages, format)->
"https://my-card.in/decks/new#{if format then '.' + format else ''}?name=#{encodeURIComponent name}&cards=#{@encode card_usages}"
@deck_url_short = (name, card_usages, callback)->
request = require 'request'
request @deck_url(name, card_usages, 'short.url'), (error, response, body)->
callback body
\ No newline at end of file
// Generated by CoffeeScript 1.6.3
(function() {
var request;
request = require('request');
this.key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";
this.load_card_usages_from_cards = function(main, side) {
var card_id, count, last_id, result, _i, _j, _len, _len1;
result = [];
last_id = null;
for (_i = 0, _len = main.length; _i < _len; _i++) {
card_id = main[_i];
if (card_id === last_id) {
count++;
} else {
if (last_id) {
result.push({
card_id: last_id,
side: false,
count: count
});
}
last_id = card_id;
count = 1;
}
}
if (last_id) {
result.push({
card_id: last_id,
side: false,
count: count
});
}
last_id = null;
for (_j = 0, _len1 = side.length; _j < _len1; _j++) {
card_id = side[_j];
if (card_id === last_id) {
count++;
} else {
if (last_id) {
result.push({
card_id: last_id,
side: true,
count: count
});
}
last_id = card_id;
count = 1;
}
}
if (last_id) {
result.push({
card_id: last_id,
side: true,
count: count
});
}
return result;
};
this.encode = function(card_usages) {
var c, card_usage, i, result, _i, _j, _len;
result = '';
for (_i = 0, _len = card_usages.length; _i < _len; _i++) {
card_usage = card_usages[_i];
c = card_usage.side << 29 | card_usage.count << 27 | card_usage.card_id;
for (i = _j = 4; _j >= 0; i = --_j) {
result += this.key.charAt((c >> i * 6) & 0x3F);
}
}
return result;
};
this.deck_url = function(name, card_usages, format) {
return "https://my-card.in/decks/new" + (format ? '.' + format : '') + "?name=" + (encodeURIComponent(name)) + "&cards=" + (this.encode(card_usages));
};
this.deck_url_short = function(name, card_usages, callback) {
request = require('request');
return request(this.deck_url(name, card_usages, 'short.url'), function(error, response, body) {
return callback(body);
});
};
}).call(this);
/*
//@ sourceMappingURL=mycard.map
*/
{
"version": 3,
"file": "mycard.js",
"sourceRoot": "",
"sources": [
"mycard.coffee"
],
"names": [],
"mappings": ";AAAA;CAAA,KAAA,CAAA;;CAAA,CAAA,CAAU,IAAV,EAAU;;CAAV,CACA,CAAA,CAAC,+DADD;;CAAA,CAEA,CAA+B,CAA9B,KAA+B,kBAAhC;CACE,OAAA,4CAAA;CAAA,CAAA,CAAS,CAAT,EAAA;CAAA,EACU,CAAV,GAAA;AACA,CAAA,QAAA,kCAAA;0BAAA;CACE,GAAG,CAAW,CAAd,CAAG;AACD,CAAA,CAAA,GAAA,GAAA;MADF,EAAA;CAGE,GAA6D,GAA7D,CAAA;CAAA,GAAA,EAAM,IAAN;CAAY,CAAU,KAAT,KAAA;CAAD,CAAyB,EAAN,CAAnB,OAAmB;CAAnB,CAAuC,GAAP,OAAA;CAA5C,WAAA;UAAA;CAAA,EACU,IAAV,CAAA;CADA,EAEQ,EAAR,GAAA;QANJ;CAAA,IAFA;CASA,GAAA,GAAA;CAAA,GAAA,EAAA;CAAY,CAAU,KAAT,CAAA;CAAD,CAAyB,EAAN,CAAnB,GAAmB;CAAnB,CAAuC,GAAP,GAAA;CAA5C,OAAA;MATA;CAAA,EAUU,CAAV,GAAA;AACA,CAAA,QAAA,oCAAA;0BAAA;CACE,GAAG,CAAW,CAAd,CAAG;AACD,CAAA,CAAA,GAAA,GAAA;MADF,EAAA;CAGE,GAA4D,GAA5D,CAAA;CAAA,GAAA,EAAM,IAAN;CAAY,CAAU,KAAT,KAAA;CAAD,CAAyB,EAAN,QAAA;CAAnB,CAAsC,GAAP,OAAA;CAA3C,WAAA;UAAA;CAAA,EACU,IAAV,CAAA;CADA,EAEQ,EAAR,GAAA;QANJ;CAAA,IAXA;CAkBA,GAAA,GAAA;CAAA,GAAA,EAAA;CAAY,CAAU,KAAT,CAAA;CAAD,CAAyB,EAAN,IAAA;CAAnB,CAAsC,GAAP,GAAA;CAA3C,OAAA;MAlBA;CAD6B,UAoB7B;CAtBF,EAE+B;;CAF/B,CAwBA,CAAU,CAAT,EAAD,GAAW,EAAD;CACR,OAAA,8BAAA;CAAA,CAAA,CAAS,CAAT,EAAA;AACA,CAAA,QAAA,yCAAA;oCAAA;CACE,CAAI,CAAA,CAAA,CAAwB,CAA5B,CAAA,GAAc;AACd,CAAA,EAAA,QAAS,kBAAT;CACE,EAAc,CAAJ,EAAV,EAAA;CADF,MAFF;CAAA,IADA;CADQ,UAMR;CA9BF,EAwBU;;CAxBV,CAgCA,CAAY,CAAX,EAAW,EAAZ,CAAa,EAAD;CACuB,CAAH,CAAA,CAA4C,EAA5C,EAA7B,CAAA,EAAA,OAAyE,YAAzE;CAjCH,EAgCY;;CAhCZ,CAmCA,CAAkB,CAAjB,IAAiB,CAAC,EAAD,GAAlB;CACE,EAAU,CAAV,GAAA,EAAU;CACF,CAAgB,CAA2B,CAA1C,CAA0C,EAAnD,CAAQ,CAA4C,EAApD;CACW,GAAT,IAAA,KAAA;CADF,IAAmD;CArCrD,EAmCkB;CAnClB"
}
\ No newline at end of file
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
"underscore": "*", "underscore": "*",
"underscore.string": "*", "underscore.string": "*",
"freeport": "*", "freeport": "*",
"struct": "*",
"inotify": "*", "inotify": "*",
"request": "*", "request": "*",
"mongoose": "*" "mongoose": "*"
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
"PLAYER_INFO": "CTOS_PlayerInfo", "PLAYER_INFO": "CTOS_PlayerInfo",
"JOIN_GAME":"CTOS_JoinGame", "JOIN_GAME":"CTOS_JoinGame",
"UPDATE_DECK": "deck", "UPDATE_DECK": "deck",
"CHANGE_SIDE":"",
"CHAT": "chat" "CHAT": "chat"
}, },
"STOC":{ "STOC":{
......
...@@ -3,6 +3,17 @@ _.str = require 'underscore.string' ...@@ -3,6 +3,17 @@ _.str = require 'underscore.string'
_.mixin(_.str.exports()); _.mixin(_.str.exports());
spawn = require('child_process').spawn spawn = require('child_process').spawn
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
bunyan = require 'bunyan'
settings = require './config.json'
log = bunyan.createLogger name: "mycard-room"
if settings.modules.database
mongoose = require 'mongoose'
mongoose.connect(settings.modules.database);
User = require './user.js'
Deck = require './deck.js'
Match = require './match.js'
class Room class Room
#name #name
#port #port
...@@ -14,21 +25,36 @@ class Room ...@@ -14,21 +25,36 @@ class Room
@all = [] @all = []
@find_or_create_by_name: (name)-> @find_or_create_by_name: (name)->
result = @find_by_name(name) ? new Room(name) @find_by_name(name) ? new Room(name)
@find_by_name: (name)-> @find_by_name: (name)->
_.find @all, (room)-> result = _.find @all, (room)->
room.name == name room.name == name
log.info 'find_by_name', name, result
result
@find_by_port: (port)-> @find_by_port: (port)->
_.find @all, (room)-> _.find @all, (room)->
room.port == port room.port == port
@validate: (name)->
client_name_and_pass = name.split('$',2)
client_name = client_name_and_pass[0]
client_pass = client_name_and_pass[1]
!_.find Room.all, (room)->
room_name_and_pass = room.name.split('$',2)
room_name = room_name_and_pass[0]
room_pass = room_name_and_pass[1]
client_name == room_name and client_pass != room_pass
constructor: (name) -> constructor: (name) ->
@name = name @name = name
@alive = true @alive = true
@players = [] @players = []
@status = 'starting' @status = 'starting'
@established = false
@watcher_buffers = []
@watchers = []
Room.all.push this Room.all.push this
if name[0...2] == 'M#' if name[0...2] == 'M#'
...@@ -43,25 +69,114 @@ class Room ...@@ -43,25 +69,114 @@ class Room
@process = spawn './ygopro', param, cwd: 'ygocore' @process = spawn './ygopro', param, cwd: 'ygocore'
@process.on 'exit', (code)=> @process.on 'exit', (code)=>
console.log "room process #{@port} exited with code #{code}" log.info 'room-exit', this.name, this.port, code
@disconnector = 'server' unless @disconnector
this.delete() this.delete()
@process.stdout.setEncoding('utf8') @process.stdout.setEncoding('utf8')
@process.stdout.once 'data', (data)=> @process.stdout.once 'data', (data)=>
@established = true @established = true
@port = parseInt data @port = parseInt data
#setTimeout =>
_.each @players, (player)=> _.each @players, (player)=>
player.server.connect @port, '127.0.0.1',=> player.server.connect @port, '127.0.0.1',=>
player.server.write buffer for buffer in player.pre_establish_buffers player.server.write buffer for buffer in player.pre_establish_buffers
player.established = true player.established = true
delete: (room)-> delete: ->
Room.all.splice(_.indexOf(Room.all, room), 1) #积分
return if @deleted
@save_match() if _.startsWith(@name, 'M#') and @started and settings.modules.database
index = _.indexOf(Room.all, this)
Room.all.splice(index, 1) unless index == -1
@deleted = true
toString: -> toString: ->
"room: #{@name} #{@port} #{@alive ? 'alive' : 'not-alive'} #{@dueling ? 'dueling' : 'not-dueling'} [#{("client #{typeof player.client} server #{typeof player.server} #{player.name} #{player.pos}. " for player in @players)}] #{JSON.stringify @pos_name}" "room: #{@name} #{@port} #{@alive ? 'alive' : 'not-alive'} #{@dueling ? 'dueling' : 'not-dueling'} [#{("client #{typeof player.client} server #{typeof player.server} #{player.name} #{player.pos}. " for player in @players)}] #{JSON.stringify @pos_name}"
ensure_finish: ()->
#判断match是否正常结束
player_wins = [0,0,0]
for duel in @duels
player_wins[duel.winner] += 1
normal_ended = player_wins[0] >= 2 or player_wins[1] >= 2
if !normal_ended
if @disconnector == 'server'
return false
if @duels.length == 0 or _.last(@duels).reason != 4
@duels.push {winner: 1-@disconnector.pos, reason: 4}
true
save_match: ()->
return unless @ensure_finish()
match_winner = _.last(@duels).winner
User.findOne { name: @dueling_players[0].name }, (err, player0)=>
if(err)
log.error "error when find user", @dueling_players[0].name, err
else if(!player0)
log.error "can't find user ", @dueling_players[0].name
else
User.findOne { name: @dueling_players[1].name }, (err, player1)=>
if(err)
log.error "error when find user", @dueling_players[1].name, err
else if(!player1)
log.error "can't find user ", @dueling_players[1].name
else
#---------------------------------------------------------------------------
#卡组
log.info user: player0._id, card_usages: @dueling_players[0].deck
Deck.findOne user: player0._id, card_usages: @dueling_players[0].deck, (err, deck0)=>
if(err)
log.error "error when find deck"
else if(!deck0)
deck0 = new Deck({name: 'match', user: player0._id, card_usages: @dueling_players[0].deck, used_count: 1, last_used_at: Date.now()})
deck0.save()
else
deck0.used_count++
deck0.last_used_at = Date.now()
deck0.save()
log.info deck0
log.info @dueling_players[0].deck, @dueling_players[1].deck, @dueling_players
Deck.findOne user: player1._id, card_usages: @dueling_players[1].deck, (err, deck1)=>
if(err)
log.error "error when find deck"
else if(!deck1)
deck1 = new Deck({name: 'match', user: player1._id, card_usages: @dueling_players[1].deck, used_count: 1, last_used_at: Date.now()})
deck1.save()
else
deck1.used_count++
deck1.last_used_at = Date.now()
deck1.save()
log.info deck1
Match.create
players: [{user: player0._id, deck: deck0._id}, {user: player1._id, deck: deck1._id}]
duels: @duels
winner: if match_winner == 0 then player0._id else player1._id,
ygopro_version: settings.version
,(err, match)->
log.info err, match
#积分
if match_winner == 0
winner = player0
loser = player1
else
winner = player1
loser = player0
log.info('before_settle_result',winner.name, winner.points,loser.name, loser.points)
winner.points += 5
if _.last(@duels).reason == 4
loser.points -= 8
else
loser.points -= 3
log.info('duel_settle_result',winner.name, winner.points,loser.name, loser.points)
winner.save()
loser.save()
connect: (client)-> connect: (client)->
@players.push client @players.push client
...@@ -71,10 +186,18 @@ class Room ...@@ -71,10 +186,18 @@ class Room
client.established = true client.established = true
disconnect: (client, error)-> disconnect: (client, error)->
@players = _.reject @players, (player)-> if client.is_post_watcher
player is client ygopro.stoc_send_chat_to_room this, "#{client.name} #{'退出了观战'}#{if error then ": #{error}" else ''}"
index = _.indexOf(@watchers, client)
@watchers.splice(index, 1) unless index == -1
else
index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1
if @players.length
ygopro.stoc_send_chat_to_room this, "#{client.name} #{'离开了游戏'}#{if error then ": #{error}" else ''}"
else
@process.kill()
this.delete()
for player in @players
ygopro.stoc_send_chat(player, "#{client.name} 离开了游戏#{if error then ": #{error}" else ''}")
module.exports = Room module.exports = Room
\ No newline at end of file
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
(function() { (function() {
var Room, spawn, ygopro, _; var Deck, Match, Room, User, bunyan, log, mongoose, settings, spawn, ygopro, _;
_ = require('underscore'); _ = require('underscore');
...@@ -12,18 +12,37 @@ ...@@ -12,18 +12,37 @@
ygopro = require('./ygopro.js'); ygopro = require('./ygopro.js');
bunyan = require('bunyan');
settings = require('./config.json');
log = bunyan.createLogger({
name: "mycard-room"
});
if (settings.modules.database) {
mongoose = require('mongoose');
mongoose.connect(settings.modules.database);
User = require('./user.js');
Deck = require('./deck.js');
Match = require('./match.js');
}
Room = (function() { Room = (function() {
Room.all = []; Room.all = [];
Room.find_or_create_by_name = function(name) { Room.find_or_create_by_name = function(name) {
var result, _ref; var _ref;
return result = (_ref = this.find_by_name(name)) != null ? _ref : new Room(name); return (_ref = this.find_by_name(name)) != null ? _ref : new Room(name);
}; };
Room.find_by_name = function(name) { Room.find_by_name = function(name) {
return _.find(this.all, function(room) { var result;
result = _.find(this.all, function(room) {
return room.name === name; return room.name === name;
}); });
log.info('find_by_name', name, result);
return result;
}; };
Room.find_by_port = function(port) { Room.find_by_port = function(port) {
...@@ -32,6 +51,20 @@ ...@@ -32,6 +51,20 @@
}); });
}; };
Room.validate = function(name) {
var client_name, client_name_and_pass, client_pass;
client_name_and_pass = name.split('$', 2);
client_name = client_name_and_pass[0];
client_pass = client_name_and_pass[1];
return !_.find(Room.all, function(room) {
var room_name, room_name_and_pass, room_pass;
room_name_and_pass = room.name.split('$', 2);
room_name = room_name_and_pass[0];
room_pass = room_name_and_pass[1];
return client_name === room_name && client_pass !== room_pass;
});
};
function Room(name) { function Room(name) {
var param, var param,
_this = this; _this = this;
...@@ -39,6 +72,9 @@ ...@@ -39,6 +72,9 @@
this.alive = true; this.alive = true;
this.players = []; this.players = [];
this.status = 'starting'; this.status = 'starting';
this.established = false;
this.watcher_buffers = [];
this.watchers = [];
Room.all.push(this); Room.all.push(this);
if (name.slice(0, 2) === 'M#') { if (name.slice(0, 2) === 'M#') {
param = [0, 0, 0, 1, 'F', 'F', 'F', 8000, 5, 1]; param = [0, 0, 0, 1, 'F', 'F', 'F', 8000, 5, 1];
...@@ -54,7 +90,10 @@ ...@@ -54,7 +90,10 @@
cwd: 'ygocore' cwd: 'ygocore'
}); });
this.process.on('exit', function(code) { this.process.on('exit', function(code) {
console.log("room process " + _this.port + " exited with code " + code); log.info('room-exit', _this.name, _this.port, code);
if (!_this.disconnector) {
_this.disconnector = 'server';
}
return _this["delete"](); return _this["delete"]();
}); });
this.process.stdout.setEncoding('utf8'); this.process.stdout.setEncoding('utf8');
...@@ -75,8 +114,19 @@ ...@@ -75,8 +114,19 @@
}); });
} }
Room.prototype["delete"] = function(room) { Room.prototype["delete"] = function() {
return Room.all.splice(_.indexOf(Room.all, room), 1); var index;
if (this.deleted) {
return;
}
if (_.startsWith(this.name, 'M#') && this.started && settings.modules.database) {
this.save_match();
}
index = _.indexOf(Room.all, this);
if (index !== -1) {
Room.all.splice(index, 1);
}
return this.deleted = true;
}; };
Room.prototype.toString = function() { Room.prototype.toString = function() {
...@@ -97,6 +147,141 @@ ...@@ -97,6 +147,141 @@
}).call(this)) + "] " + (JSON.stringify(this.pos_name)); }).call(this)) + "] " + (JSON.stringify(this.pos_name));
}; };
Room.prototype.ensure_finish = function() {
var duel, normal_ended, player_wins, _i, _len, _ref;
player_wins = [0, 0, 0];
_ref = this.duels;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
duel = _ref[_i];
player_wins[duel.winner] += 1;
}
normal_ended = player_wins[0] >= 2 || player_wins[1] >= 2;
if (!normal_ended) {
if (this.disconnector === 'server') {
return false;
}
if (this.duels.length === 0 || _.last(this.duels).reason !== 4) {
this.duels.push({
winner: 1 - this.disconnector.pos,
reason: 4
});
}
}
return true;
};
Room.prototype.save_match = function() {
var match_winner,
_this = this;
if (!this.ensure_finish()) {
return;
}
match_winner = _.last(this.duels).winner;
return User.findOne({
name: this.dueling_players[0].name
}, function(err, player0) {
if (err) {
return log.error("error when find user", _this.dueling_players[0].name, err);
} else if (!player0) {
return log.error("can't find user ", _this.dueling_players[0].name);
} else {
return User.findOne({
name: _this.dueling_players[1].name
}, function(err, player1) {
var loser, winner;
if (err) {
return log.error("error when find user", _this.dueling_players[1].name, err);
} else if (!player1) {
return log.error("can't find user ", _this.dueling_players[1].name);
} else {
log.info({
user: player0._id,
card_usages: _this.dueling_players[0].deck
});
Deck.findOne({
user: player0._id,
card_usages: _this.dueling_players[0].deck
}, function(err, deck0) {
if (err) {
log.error("error when find deck");
} else if (!deck0) {
deck0 = new Deck({
name: 'match',
user: player0._id,
card_usages: _this.dueling_players[0].deck,
used_count: 1,
last_used_at: Date.now()
});
deck0.save();
} else {
deck0.used_count++;
deck0.last_used_at = Date.now();
deck0.save();
}
log.info(deck0);
log.info(_this.dueling_players[0].deck, _this.dueling_players[1].deck, _this.dueling_players);
return Deck.findOne({
user: player1._id,
card_usages: _this.dueling_players[1].deck
}, function(err, deck1) {
if (err) {
log.error("error when find deck");
} else if (!deck1) {
deck1 = new Deck({
name: 'match',
user: player1._id,
card_usages: _this.dueling_players[1].deck,
used_count: 1,
last_used_at: Date.now()
});
deck1.save();
} else {
deck1.used_count++;
deck1.last_used_at = Date.now();
deck1.save();
}
log.info(deck1);
return Match.create({
players: [
{
user: player0._id,
deck: deck0._id
}, {
user: player1._id,
deck: deck1._id
}
],
duels: _this.duels,
winner: match_winner === 0 ? player0._id : player1._id,
ygopro_version: settings.version
}, function(err, match) {
return log.info(err, match);
});
});
});
if (match_winner === 0) {
winner = player0;
loser = player1;
} else {
winner = player1;
loser = player0;
}
log.info('before_settle_result', winner.name, winner.points, loser.name, loser.points);
winner.points += 5;
if (_.last(_this.duels).reason === 4) {
loser.points -= 8;
} else {
loser.points -= 3;
}
log.info('duel_settle_result', winner.name, winner.points, loser.name, loser.points);
winner.save();
return loser.save();
}
});
}
});
};
Room.prototype.connect = function(client) { Room.prototype.connect = function(client) {
this.players.push(client); this.players.push(client);
if (this.established) { if (this.established) {
...@@ -113,17 +298,25 @@ ...@@ -113,17 +298,25 @@
}; };
Room.prototype.disconnect = function(client, error) { Room.prototype.disconnect = function(client, error) {
var player, _i, _len, _ref, _results; var index;
this.players = _.reject(this.players, function(player) { if (client.is_post_watcher) {
return player === client; ygopro.stoc_send_chat_to_room(this, "" + client.name + " " + '退出了观战' + (error ? ": " + error : ''));
}); index = _.indexOf(this.watchers, client);
_ref = this.players; if (index !== -1) {
_results = []; return this.watchers.splice(index, 1);
for (_i = 0, _len = _ref.length; _i < _len; _i++) { }
player = _ref[_i]; } else {
_results.push(ygopro.stoc_send_chat(player, "" + client.name + " 离开了游戏" + (error ? ": " + error : ''))); index = _.indexOf(this.players, client);
if (index !== -1) {
this.players.splice(index, 1);
}
if (this.players.length) {
return ygopro.stoc_send_chat_to_room(this, "" + client.name + " " + '离开了游戏' + (error ? ": " + error : ''));
} else {
this.process.kill();
return this["delete"]();
}
} }
return _results;
}; };
return Room; return Room;
......
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
"room.coffee" "room.coffee"
], ],
"names": [], "names": [],
"mappings": "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" "mappings": "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"
} }
\ No newline at end of file
This diff is collapsed.
settings = require './config.json'
mongoose = require 'mongoose'
User = mongoose.model 'User',
name: String
points: Number
module.exports = User
\ No newline at end of file
// Generated by CoffeeScript 1.6.3
(function() {
var User, mongoose, settings;
settings = require('./config.json');
mongoose = require('mongoose');
User = mongoose.model('User', {
name: String,
points: Number
});
module.exports = User;
}).call(this);
/*
//@ sourceMappingURL=user.map
*/
{
"version": 3,
"file": "user.js",
"sourceRoot": "",
"sources": [
"user.coffee"
],
"names": [],
"mappings": ";AAAA;CAAA,KAAA,kBAAA;;CAAA,CAAA,CAAW,IAAA,CAAX,OAAW;;CAAX,CAEA,CAAW,IAAA,CAAX,EAAW;;CAFX,CAGA,CAAO,CAAP,CAAO,CAAA,EAAQ;CACb,CAAM,EAAN,EAAA;CAAA,CACQ,EAAR,EAAA;CALF,GAGO;;CAHP,CAOA,CAAiB,CAPjB,EAOM,CAAN;CAPA"
}
\ No newline at end of file
{
"0":"投降",
"1":"LP变成0",
"2":"没有卡可抽",
"3":"超时",
"4":"失去连接",
"16":"「被封印的艾克佐迪亚」效果胜利",
"17": "「终焉的倒计时」效果胜利",
"18": "「毒蛇神 维诺米纳迦」效果胜利",
"19": "「光之创造神 哈拉克提」效果胜利",
"20": "「究极封印神 艾克佐迪奥斯」效果胜利",
"21": "「通灵盘」效果胜利",
"22": "「最终一战!」效果胜利",
"23": "「No.88 机关傀儡-命运狮子」效果胜利",
"32": "由于「%ls」的效果获得比赛胜利"
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
_ = require 'underscore'
_.str = require 'underscore.string'
_.mixin(_.str.exports());
Struct = require('struct').Struct Struct = require('struct').Struct
#常量/类型声明 #常量/类型声明
...@@ -102,7 +106,14 @@ for name, declaration of structs_declaration ...@@ -102,7 +106,14 @@ for name, declaration of structs_declaration
#util #util
@stoc_send_chat = (client, msg, player = 8)-> @stoc_send_chat = (client, msg, player = 8)->
@stoc_send client, 'CHAT', { for line in _.lines(msg)
player: player @stoc_send client, 'CHAT', {
msg: msg player: player
} msg: line
}
@stoc_send_chat_to_room = (room, msg, player = 8)->
for client in room.players
@stoc_send_chat(client, msg, player) if client
for client in room.watchers
@stoc_send_chat(client, msg, player) if client
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
(function() { (function() {
var Struct, declaration, field, name, result, structs_declaration, type, typedefs, _i, _len; var Struct, declaration, field, name, result, structs_declaration, type, typedefs, _, _i, _len;
_ = require('underscore');
_.str = require('underscore.string');
_.mixin(_.str.exports());
Struct = require('struct').Struct; Struct = require('struct').Struct;
...@@ -161,13 +167,45 @@ ...@@ -161,13 +167,45 @@
}; };
this.stoc_send_chat = function(client, msg, player) { this.stoc_send_chat = function(client, msg, player) {
var line, _j, _len1, _ref, _results;
if (player == null) {
player = 8;
}
_ref = _.lines(msg);
_results = [];
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
line = _ref[_j];
_results.push(this.stoc_send(client, 'CHAT', {
player: player,
msg: line
}));
}
return _results;
};
this.stoc_send_chat_to_room = function(room, msg, player) {
var client, _j, _k, _len1, _len2, _ref, _ref1, _results;
if (player == null) { if (player == null) {
player = 8; player = 8;
} }
return this.stoc_send(client, 'CHAT', { _ref = room.players;
player: player, for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
msg: msg client = _ref[_j];
}); if (client) {
this.stoc_send_chat(client, msg, player);
}
}
_ref1 = room.watchers;
_results = [];
for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
client = _ref1[_k];
if (client) {
_results.push(this.stoc_send_chat(client, msg, player));
} else {
_results.push(void 0);
}
}
return _results;
}; };
}).call(this); }).call(this);
......
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
"ygopro.coffee" "ygopro.coffee"
], ],
"names": [], "names": [],
"mappings": ";AAAA;CAAA,KAAA,iFAAA;;CAAA,CAAA,CAAS,GAAT,CAAS,CAAA;;CAAT,CAGA,CAAsB,IAAA,SAAA,GAAtB;;CAHA,CAIA,CAAW,IAAA,CAAX,SAAW;;CAJX,CAKA,CAAiB,CAAhB,GAAgB,MAAjB,SAAiB;;CALjB,CAMA,CAAa,CAAZ,GAAY,EAAb,SAAa;;CANb,CASA,CAAW,CAAV,GAAD;;AACA,CAAA,MAAA,oBAAA;6CAAA;CACE,EAAS,CAAT,EAAA;AACA,CAAA,QAAA,yCAAA;+BAAA;CACE,GAAG,CAAK,CAAR,EAAA;CACE,IAAY,GAAZ,QAAO;CAAP,SAAA,KACO;CAAgB,CAAyB,CAAa,CAAtC,CAAA,CAAM,EAAN,IAAA;CAAhB;CADP;CAEO,EAA8B,EAAK,GAAnC,UAAO,MAAA;CAFd,QADF;MAAA,EAAA;CAKE,EAAO,CAAP,CAAY,GAAZ;CACA,GAAyB,IAAzB;CAAA,EAAO,CAAP,IAAgB,EAAhB;UADA;CAEA,GAAG,CAAK,CAAR,EAAA;CACE,CAAyB,EAAzB,CAAA,CAAM,IAAN;MADF,IAAA;CAGE,GAAG,GAAS,GAAZ;CACE,CAA0B,EAA1B,CAAmB,CAAb,CAA6B,KAAnC;MADF,MAAA;CAGE,GAAO,CAAW,CAAX,MAAP;YANJ;UAPF;QADF;CAAA,IADA;CAAA,EAgBiB,CAAjB,EAhBA,CAgBS;CAjBX,EAVA;;CAAA,CA+BA,CAAgB,CAAf,QAAD;;CA/BA,CAgCA,CAAgB,CAAf,QAAD;;CAhCA,CAiCA,CAAe,CAAd,CAAc,GAAA,CAAC,EAAhB;CACE,OAAA,QAAA;AAAG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAiB,CAA1C,GAAoC;CAApC,aAAM,CAAN;QALF;MAAA;CAMC,EAAsB,CAAtB,CAAa,MAAd,CAAc;CAAS,CAAW,IAAV,EAAA;CAAD,CAAkC,IAAb,KAAA;CAP/B;CAjCf,EAiCe;;CAjCf,CAyCA,CAAe,CAAd,CAAc,GAAA,CAAC,EAAhB;CACE,OAAA,QAAA;AAAG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAiB,CAA1C,GAAoC;CAApC,aAAM,CAAN;QALF;MAAA;CAMC,EAAsB,CAAtB,CAAa,MAAd,CAAc;CAAS,CAAW,IAAV,EAAA;CAAD,CAAkC,IAAb,KAAA;CAP/B;CAzCf,EAyCe;;CAzCf,CAoDA,CAAa,CAAZ,CAAY,CAAA,GAAb;CAEE,OAAA,gCAAA;AAAG,CAAH,GAAA,CAAkB,CAAf,KAAH;CACE,CAAA,CAAS,GAAT;CACa,GAAP,EAFR,EAEQ;CACN,EAAS,CAAT,EAAA;MAHF;CAKE,EAAS,CAAC,CAA4B,CAAtC,CAAkB,MAAc;CAAhC,KACA,EAAA;CADA,EAEA,CAAA,EAAA;CAFA,EAGS,GAAT;MARF;AAUG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAiB,CAA1C,GAAoC;CAApC,aAAM,CAAN;QALF;MAVA;CAAA,EAiBa,CAAb,EAAA;CAjBA,CAkBwC,CAAH,CAArC,EAAM,OAAN;CAlBA,CAmByB,EAAzB,CAAA,CAAM,IAAN;CAnBA,GAoBA,CAAA,CAAM;CACN,GAAA,EAA6B;CAAtB,IAAP,CAAM,OAAN;MAvBW;CApDb,EAoDa;;CApDb,CA6EA,CAAa,CAAZ,CAAY,CAAA,GAAb;CAEE,OAAA,gCAAA;AAAG,CAAH,GAAA,CAAkB,CAAf,KAAH;CACE,CAAA,CAAS,GAAT;CACa,GAAP,EAFR,EAEQ;CACN,EAAS,CAAT,EAAA;MAHF;CAKE,EAAS,CAAC,CAA4B,CAAtC,CAAkB,MAAc;CAAhC,KACA,EAAA;CADA,EAEA,CAAA,EAAA;CAFA,EAGS,GAAT;MARF;AAUG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAiB,CAA1C,GAAoC;CAApC,aAAM,CAAN;QALF;MAVA;CAAA,EAiBa,CAAb,EAAA;CAjBA,CAkBwC,CAAH,CAArC,EAAM,OAAN;CAlBA,CAmByB,EAAzB,CAAA,CAAM,IAAN;CAnBA,GAoBA,CAAA,CAAM;CACN,GAAA,EAA6B;CAAtB,IAAP,CAAM,OAAN;MAvBW;CA7Eb,EA6Ea;;CA7Eb,CAuGA,CAAkB,CAAjB,EAAiB,GAAC,KAAnB;;GAAyC,GAAT;MAC9B;CAAC,CAAkB,EAAlB,EAAD,GAAA,EAAA;CAA2B,CACjB,IAAR;CADyB,CAEnB,CAAN,GAAA;CAHc,KAChB;CAxGF,EAuGkB;CAvGlB" "mappings": "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"
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment