Commit 098a4dfa authored by mercury233's avatar mercury233

lite version test1

parent b6b8122a
{ {
"ip": "127.0.0.1", "ip": "123.45.67.89",
"port": 7911, "port": 233,
"version": 4917, "version": 4917,
"modules": { "modules": {
"welcome": "Mycard Server", "welcome": "YGOPRO Server",
"tips": "http://mercury233.me/ygosrv233/tips.json", "tips": "http://mercury233.me/ygosrv233/tips.json",
"dialogues": "http://mercury233.me/ygosrv233/dialogues.json", "dialogues": "http://mercury233.me/ygosrv233/dialogues.json",
"database": false,
"post_start_watching": true, "post_start_watching": true,
"skip_empty_side": true, "skip_empty_side": true,
"http": { "http": {
......
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.9.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);
[-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.9.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);
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.9.3
(function() {
var request;
request = require('request');
this.key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";
this.load_card_usages_from_cards = function(main, side) {
var card_id, count, j, k, last_id, len, len1, result;
result = [];
last_id = null;
for (j = 0, len = main.length; j < len; j++) {
card_id = main[j];
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 (k = 0, len1 = side.length; k < len1; k++) {
card_id = side[k];
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, j, k, len, result;
result = '';
for (j = 0, len = card_usages.length; j < len; j++) {
card_usage = card_usages[j];
c = card_usage.side << 29 | card_usage.count << 27 | card_usage.card_id;
for (i = k = 4; k >= 0; i = --k) {
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);
{ {
"name": "ygopro-server", "name": "ygopro-server",
"version": "2.1.0", "version": "2.3.3",
"description": "a server for ygopro", "description": "a server for ygopro",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/mycard/ygopro-server.git" "url": "https://github.com/mercury233/ygopro-server.git"
}, },
"keywords": [ "keywords": [
"mycard", "mycard",
"ygopro", "ygopro",
"server" "server"
], ],
"author": "zh99998 <zh99998@gmail.com>", "author": "zh99998 <zh99998@gmail.com>, mercury233 <me@mercury233.me>",
"dependencies": { "dependencies": {
"underscore": "*", "underscore": "*",
"underscore.string": "*", "underscore.string": "*",
"freeport": "*",
"request": "*", "request": "*",
"mongoose": "*",
"bunyan": "*", "bunyan": "*",
"websocket": "~1.0.8"
}, },
"license": "GPLv3", "license": "GPLv3",
"main": "ygopro-server.js", "main": "ygopro-server.js",
......
{
"1": [
{"card": 55586621, "count": 10},
{"card": 6061630, "count": 1},
{"card": 423585, "count": 1},
{"card": 29088922, "count": 1},
{"card": 87608852, "count": 1},
{"card": 19613556, "count": 1},
{"card": 25123082, "count": 1},
{"card": 52105192, "count": 1},
{"card": 53129443, "count": 1},
{"card": 68663748, "count": 1},
{"card": 75500286, "count": 1},
{"card": 81439173, "count": 1},
{"card": 83764718, "count": 1},
{"card": 89739383, "count": 1},
{"card": 98645731, "count": 1},
{"card": 14087893, "count": 1},
{"card": 88616795, "count": 1},
{"card": 9622164, "count": 1},
{"card": 52628687, "count": 1},
{"card": 67775894, "count": 1},
{"card": 33981008, "count": 1},
{"card": 97077563, "count": 1},
{"card": 1992816, "count": 1},
{"card": 64332231, "count": 1},
{"card": 91949988, "count": 1},
{"card": 10000030, "count": 1},
{"card": 29669359, "count": 1},
{"card": 770365, "count": 1},
{"card": 39987164, "count": 1},
{"card": 56840427, "count": 1},
{"card": 84013237, "count": 1},
{"card": 54719828, "count": 1},
{"card": 51735257, "count": 1},
{"card": 37926346, "count": 1},
{"card": 25341652, "count": 1},
{"card": 34086406, "count": 1},
{"card": 12014404, "count": 1}
],
"2": [
{"card": 4392470, "count": 10},
{"card": 40200834, "count": 1},
{"card": 69780745, "count": 1},
{"card": 10538007, "count": 1},
{"card": 82293134, "count": 1},
{"card": 20546916, "count": 1},
{"card": 33951077, "count": 1},
{"card": 89631139, "count": 1},
{"card": 95788410, "count": 1},
{"card": 39111158, "count": 1},
{"card": 42129512, "count": 1},
{"card": 74677424, "count": 1},
{"card": 47660516, "count": 1},
{"card": 96765646, "count": 1},
{"card": 48995978, "count": 1}
]
}
\ No newline at end of file
...@@ -5,14 +5,8 @@ spawn = require('child_process').spawn ...@@ -5,14 +5,8 @@ spawn = require('child_process').spawn
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
bunyan = require 'bunyan' bunyan = require 'bunyan'
settings = require './config.json' settings = require './config.json'
log = bunyan.createLogger name: "mycard-room"
if settings.modules.database log = bunyan.createLogger name: "mycard-room"
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
...@@ -54,9 +48,7 @@ class Room ...@@ -54,9 +48,7 @@ class Room
@status = 'starting' @status = 'starting'
@established = false @established = false
@watcher_buffers = [] @watcher_buffers = []
#@watcher_stanzas = []
@watchers = [] @watchers = []
#@ws_watchers = []
Room.all.push this Room.all.push this
@hostinfo = @hostinfo =
...@@ -105,101 +97,11 @@ class Room ...@@ -105,101 +97,11 @@ class Room
delete: -> delete: ->
#积分 #积分
return if @deleted return if @deleted
@save_match() if _.startsWith(@name, 'M#') and @started and settings.modules.database
index = _.indexOf(Room.all, this) index = _.indexOf(Room.all, this)
Room.all[index] = null unless index == -1 Room.all[index] = null unless index == -1
Room.all.splice(index, 1) unless index == -1 Room.all.splice(index, 1) unless index == -1
@deleted = true @deleted = true
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}"
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
return unless @dueling_players[0] and @dueling_players[1] #a WTF fix
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
......
// Generated by CoffeeScript 1.9.3 // Generated by CoffeeScript 1.9.3
(function() { (function() {
var Deck, Match, Room, User, _, bunyan, log, mongoose, settings, spawn, ygopro; var Room, _, bunyan, log, settings, spawn, ygopro;
_ = require('underscore'); _ = require('underscore');
...@@ -20,14 +20,6 @@ ...@@ -20,14 +20,6 @@
name: "mycard-room" 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 = [];
...@@ -138,9 +130,6 @@ ...@@ -138,9 +130,6 @@
if (this.deleted) { if (this.deleted) {
return; return;
} }
if (_.startsWith(this.name, 'M#') && this.started && settings.modules.database) {
this.save_match();
}
index = _.indexOf(Room.all, this); index = _.indexOf(Room.all, this);
if (index !== -1) { if (index !== -1) {
Room.all[index] = null; Room.all[index] = null;
...@@ -151,152 +140,6 @@ ...@@ -151,152 +140,6 @@
return this.deleted = true; return this.deleted = true;
}; };
Room.prototype.toString = function() {
var player, ref, ref1;
return "room: " + this.name + " " + this.port + " " + ((ref = this.alive) != null ? ref : {
'alive': 'not-alive'
}) + " " + ((ref1 = this.dueling) != null ? ref1 : {
'dueling': 'not-dueling'
}) + " [" + ((function() {
var i, len, ref2, results;
ref2 = this.players;
results = [];
for (i = 0, len = ref2.length; i < len; i++) {
player = ref2[i];
results.push("client " + (typeof player.client) + " server " + (typeof player.server) + " " + player.name + " " + player.pos + ". ");
}
return results;
}).call(this)) + "] " + (JSON.stringify(this.pos_name));
};
Room.prototype.ensure_finish = function() {
var duel, i, len, normal_ended, player_wins, 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;
if (!this.ensure_finish()) {
return;
}
match_winner = _.last(this.duels).winner;
if (!(this.dueling_players[0] && this.dueling_players[1])) {
return;
}
return User.findOne({
name: this.dueling_players[0].name
}, (function(_this) {
return function(err, player0) {
if (err) {
} else if (!player0) {
} else {
return User.findOne({
name: _this.dueling_players[1].name
}, function(err, player1) {
var loser, winner;
if (err) {
} else if (!player1) {
} else {
Deck.findOne({
user: player0._id,
card_usages: _this.dueling_players[0].deck
}, function(err, deck0) {
if (err) {
} 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();
}
return Deck.findOne({
user: player1._id,
card_usages: _this.dueling_players[1].deck
}, function(err, deck1) {
if (err) {
} 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();
}
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) {});
});
});
if (match_winner === 0) {
winner = player0;
loser = player1;
} else {
winner = player1;
loser = player0;
}
winner.points += 5;
if (_.last(_this.duels).reason === 4) {
loser.points -= 8;
} else {
loser.points -= 3;
}
winner.save();
return loser.save();
}
});
}
};
})(this));
};
Room.prototype.connect = function(client) { Room.prototype.connect = function(client) {
this.players.push(client); this.players.push(client);
if (this.established) { if (this.established) {
......
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.9.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);
{
"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.
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