Commit 5fdfc4c7 authored by mercury233's avatar mercury233

init arena_mode

parent aefedb6a
......@@ -19,6 +19,11 @@
"mycard_auth": "https://ygobbs.com",
"post_deck": "http://mycard.moe/ygopro/analytics/deck/text",
"hang_timeout": 90,
"arena_mode": {
"mode": "entertain",
"post_score": "https://mycard.moe/ygopro/arena/index.php?c=",
"get_score": "https://mycard.moe/ygopro/arena/index.php?c=query&username="
},
"tournament_mode": {
"enabled": false,
"deck_path": "./decks/",
......
......@@ -284,6 +284,7 @@ class Room
@watchers = []
@random_type = ''
@welcome = ''
@scores = {}
ROOM_all.push this
@hostinfo ||=
......@@ -417,6 +418,30 @@ class Room
delete: ->
return if @deleted
#log.info 'room-delete', this.name, ROOM_all.length
if @started and settings.modules.arena_mode.post_score
#log.info @scores
score_array=[]
for name, score of @scores
score_array.push { name: name, score: score }
log.info @start_time, score_array
request.post { url : settings.modules.arena_mode.post_score , form : {
accesskey: process.env.MYCARD_AUTH_KEY,
usernameA: score_array[0].name,
usernameB: score_array[1].name,
userscoreA: score_array[0].score,
userscoreB: score_array[1].score,
start: @start_time,
end: moment().format(),
arena: settings.modules.arena_mode.mode
}}, (error, response, body)=>
if error
log.warn 'SCORE POST ERROR', error, response
else
if response.statusCode != 204
log.warn 'SCORE POST', response.statusCode, response.statusMessage, @name, body
else
log.info 'SCORE POST', response.statusCode, response.statusMessage, @name, body
return
if @player_datas.length and settings.modules.enable_cloud_replay
replay_id = @cloud_replay_id
if @has_ygopro_error
......@@ -522,7 +547,10 @@ class Room
index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1
#log.info(@started,@disconnector,@random_type)
if @started and @disconnector != 'server' and @random_type and (client.pos < 4 or client.is_host)
if @started and @disconnector != 'server' and (client.pos < 4 or client.is_host)
@finished = true
@scores[client.name] = -1
if @random_type
ROOM_ban_player(client.name, client.ip, "强退")
if @players.length and !(@windbot and client.is_host)
ygopro.stoc_send_chat_to_room this, "#{client.name} 离开了游戏" + if error then ": #{error}" else ''
......@@ -1037,7 +1065,17 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN)
if room.welcome
ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE)
#log.info(ROOM_all)
if settings.modules.arena_mode.get_score
request
url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name),
json: true
, (error, response, body)->
if error or !body or _.isString body
log.warn 'LOAD SCORE ERROR', client.name, error, response, body
else
log.info 'LOAD SCORE', client.name, body
ygopro.stoc_send_chat(client, "积分系统测试中,您有#{body.exp}点经验,#{body.pt}点战斗力。正式上线前这些数据可能被重置。", ygopro.constants.COLORS.BABYBLUE)
return
if !room.recorder
room.recorder = recorder = net.connect room.port, ->
......@@ -1133,6 +1171,9 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
#log.info {winner: pos, reason: reason}
#room.duels.push {winner: pos, reason: reason}
room.winner = pos
if !room.finished
room.winner_name = room.dueling_players[pos].name
room.scores[room.winner_name] = room.scores[room.winner_name] + 1
#lp跟踪
if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host
......@@ -1276,11 +1317,13 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
return unless room
unless room.started #first start
room.started = true
room.start_time = moment().format()
roomlist.delete room.name if settings.modules.enable_websocket_roomlist and not room.private
#room.duels = []
room.dueling_players = []
for player in room.players when player.pos != 7
room.dueling_players[player.pos] = player
room.scores[player.name] = 0
room.player_datas.push ip: player.ip, name: player.name
if settings.modules.tips
ygopro.stoc_send_random_tip(client)
......@@ -1301,8 +1344,9 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
log.warn 'DECK POST ERROR', error, response
else
if response.statusCode != 200
log.warn 'DECK POST', response.statusCode, response.statusMessage
log.info 'DECK POST', client.name, body
log.warn 'DECK POST', response.statusCode, client.name, body
else
log.info 'DECK POST', response.statusCode, client.name, body
return
client.deck_saved = true
return
......@@ -1509,7 +1553,7 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server)->
name: room.name,
roomid: room.port.toString(),
cloud_replay_id: "R#"+room.cloud_replay_id,
players: (for player in room.players
players: (for player in room.dueling_players
name: player.name,
winner: player.pos == room.winner
)
......
......@@ -398,6 +398,7 @@
this.watchers = [];
this.random_type = '';
this.welcome = '';
this.scores = {};
ROOM_all.push(this);
this.hostinfo || (this.hostinfo = {
lflist: settings.lflist.length ? 0 : -1,
......@@ -562,10 +563,47 @@
}
Room.prototype["delete"] = function() {
var index, log_rep_id, player_ips, player_names, recorder_buffer, replay_id;
var index, log_rep_id, name, player_ips, player_names, recorder_buffer, ref, replay_id, score, score_array;
if (this.deleted) {
return;
}
if (this.started && settings.modules.arena_mode.post_score) {
score_array = [];
ref = this.scores;
for (name in ref) {
score = ref[name];
score_array.push({
name: name,
score: score
});
}
log.info(this.start_time, score_array);
request.post({
url: settings.modules.arena_mode.post_score,
form: {
accesskey: process.env.MYCARD_AUTH_KEY,
usernameA: score_array[0].name,
usernameB: score_array[1].name,
userscoreA: score_array[0].score,
userscoreB: score_array[1].score,
start: this.start_time,
end: moment().format(),
arena: settings.modules.arena_mode.mode
}
}, (function(_this) {
return function(error, response, body) {
if (error) {
log.warn('SCORE POST ERROR', error, response);
} else {
if (response.statusCode !== 204) {
log.warn('SCORE POST', response.statusCode, response.statusMessage, _this.name, body);
} else {
log.info('SCORE POST', response.statusCode, response.statusMessage, _this.name, body);
}
}
};
})(this));
}
if (this.player_datas.length && settings.modules.enable_cloud_replay) {
replay_id = this.cloud_replay_id;
if (this.has_ygopro_error) {
......@@ -696,9 +734,13 @@
if (index !== -1) {
this.players.splice(index, 1);
}
if (this.started && this.disconnector !== 'server' && this.random_type && (client.pos < 4 || client.is_host)) {
if (this.started && this.disconnector !== 'server' && (client.pos < 4 || client.is_host)) {
this.finished = true;
this.scores[client.name] = -1;
if (this.random_type) {
ROOM_ban_player(client.name, client.ip, "强退");
}
}
if (this.players.length && !(this.windbot && client.is_host)) {
ygopro.stoc_send_chat_to_room(this, (client.name + " 离开了游戏") + (error ? ": " + error : ''));
if (!this["private"] && !this.started && settings.modules.enable_websocket_roomlist) {
......@@ -1251,6 +1293,19 @@
if (room.welcome) {
ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE);
}
if (settings.modules.arena_mode.get_score) {
request({
url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name),
json: true
}, function(error, response, body) {
if (error || !body || _.isString(body)) {
log.warn('LOAD SCORE ERROR', client.name, error, response, body);
} else {
log.info('LOAD SCORE', client.name, body);
ygopro.stoc_send_chat(client, "积分系统测试中,您有" + body.exp + "点经验," + body.pt + "点战斗力。正式上线前这些数据可能被重置。", ygopro.constants.COLORS.BABYBLUE);
}
});
}
if (!room.recorder) {
room.recorder = recorder = net.connect(room.port, function() {
ygopro.ctos_send(recorder, 'PLAYER_INFO', {
......@@ -1348,6 +1403,10 @@
}
reason = buffer.readUInt8(2);
room.winner = pos;
if (!room.finished) {
room.winner_name = room.dueling_players[pos].name;
room.scores[room.winner_name] = room.scores[room.winner_name] + 1;
}
}
if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.is_host) {
pos = buffer.readUInt8(1);
......@@ -1558,6 +1617,7 @@
}
if (!room.started) {
room.started = true;
room.start_time = moment().format();
if (settings.modules.enable_websocket_roomlist && !room["private"]) {
roomlist["delete"](room.name);
}
......@@ -1569,6 +1629,7 @@
continue;
}
room.dueling_players[player.pos] = player;
room.scores[player.name] = 0;
room.player_datas.push({
ip: player.ip,
name: player.name
......@@ -1601,9 +1662,10 @@
log.warn('DECK POST ERROR', error, response);
} else {
if (response.statusCode !== 200) {
log.warn('DECK POST', response.statusCode, response.statusMessage);
log.warn('DECK POST', response.statusCode, client.name, body);
} else {
log.info('DECK POST', response.statusCode, client.name, body);
}
log.info('DECK POST', client.name, body);
}
});
}
......@@ -1893,7 +1955,7 @@
cloud_replay_id: "R#" + room.cloud_replay_id,
players: (function() {
var k, len, ref, results;
ref = room.players;
ref = room.dueling_players;
results = [];
for (k = 0, len = ref.length; k < len; k++) {
player = ref[k];
......
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