Commit c1bdbbf5 authored by nanahira's avatar nanahira Committed by GitHub

Merge pull request #2 from moecube/master

mg
parents d62cd152 0d5b65e0
...@@ -146,12 +146,14 @@ ...@@ -146,12 +146,14 @@
"exp_value_part1": ",你有", "exp_value_part1": ",你有",
"exp_value_part2": "点经验", "exp_value_part2": "点经验",
"exp_value_part3": ",你的战斗力是", "exp_value_part3": ",你的战斗力是",
"exp_value_part4": "。正式上线前这些积分可能被重置", "exp_value_part4": "。竞技场部分积分按赛季重置。",
"lp_low_opponent": "你的生命已经如风中残烛了!", "lp_low_opponent": "你的生命已经如风中残烛了!",
"lp_low_self": "背水一战!", "lp_low_self": "背水一战!",
"kicked_by_player": "被请出了房间", "kicked_by_player": "被请出了房间",
"kicked_by_system": "被系统请出了房间", "kicked_by_system": "被系统请出了房间",
"kick_count_down": "秒后房主若不开始游戏将被请出房间", "kick_count_down": "秒后房主若不开始游戏将被请出房间",
"kick_count_down_arena_part1": "秒后",
"kick_count_down_arena_part2": "若不准备或开始游戏将视为投降",
"chat_order_main": "Mycard YGOPro Server 指令帮助", "chat_order_main": "Mycard YGOPro Server 指令帮助",
"chat_order_help": "/help 显示这个帮助信息", "chat_order_help": "/help 显示这个帮助信息",
"chat_order_roomname": "/roomname 显示当前房间的名字", "chat_order_roomname": "/roomname 显示当前房间的名字",
...@@ -179,7 +181,8 @@ ...@@ -179,7 +181,8 @@
"unwelcome_warn_part1": "如果您经常", "unwelcome_warn_part1": "如果您经常",
"unwelcome_warn_part2": ",您的对手可能会离你而去。", "unwelcome_warn_part2": ",您的对手可能会离你而去。",
"unwelcome_tip_part1": "因为您的对手有", "unwelcome_tip_part1": "因为您的对手有",
"unwelcome_tip_part2": "行为,现在您可以直接离开游戏或投降,不视为强退。" "unwelcome_tip_part2": "行为,现在您可以直接离开游戏或投降,不视为强退。",
"athletic_arena_tip": "在竞技匹配中,比赛开始前退出游戏也会视为投降。"
}, },
"ko-kr": { "ko-kr": {
"random_duel_enter_room_waiting": "땅콩: 게임을 진행하게 준비 또는 시작을 하십시오.", "random_duel_enter_room_waiting": "땅콩: 게임을 진행하게 준비 또는 시작을 하십시오.",
......
...@@ -448,13 +448,15 @@ class Room ...@@ -448,13 +448,15 @@ class Room
delete: -> delete: ->
return if @deleted return if @deleted
#log.info 'room-delete', this.name, ROOM_all.length #log.info 'room-delete', this.name, ROOM_all.length
if @started and settings.modules.arena_mode.enabled and @arena
#log.info @scores
score_array=[] score_array=[]
for name, score of @scores for name, score of @scores
score_array.push { name: name, score: score } score_array.push { name: name, score: score }
if score_array.length > 0 and settings.modules.arena_mode.enabled and @arena
#log.info 'SCORE', score_array, @start_time #log.info 'SCORE', score_array, @start_time
if score_array.length == 2 if score_array.length == 2
end_time = moment().format()
if !@start_time
@start_time = end_time
request.post { url : settings.modules.arena_mode.post_score , form : { request.post { url : settings.modules.arena_mode.post_score , form : {
accesskey: settings.modules.arena_mode.accesskey, accesskey: settings.modules.arena_mode.accesskey,
usernameA: score_array[0].name, usernameA: score_array[0].name,
...@@ -462,7 +464,7 @@ class Room ...@@ -462,7 +464,7 @@ class Room
userscoreA: score_array[0].score, userscoreA: score_array[0].score,
userscoreB: score_array[1].score, userscoreB: score_array[1].score,
start: @start_time, start: @start_time,
end: moment().format(), end: end_time,
arena: @arena arena: @arena
}}, (error, response, body)=> }}, (error, response, body)=>
if error if error
...@@ -575,9 +577,13 @@ class Room ...@@ -575,9 +577,13 @@ class Room
@watchers.splice(index, 1) unless index == -1 @watchers.splice(index, 1) unless index == -1
#client.room = null #client.room = null
else else
#log.info(client.name, @started, @disconnector, @random_type, @players.length)
if @arena == "athletic" and !@started and @players.length == 2
for player in @players when player.pos != 7
@scores[player.name] = 0
@scores[client.name] = -9
index = _.indexOf(@players, client) index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1 @players.splice(index, 1) unless index == -1
#log.info(@started,@disconnector,@random_type)
if @started and @disconnector != 'server' and (client.pos < 4 or client.is_host) if @started and @disconnector != 'server' and (client.pos < 4 or client.is_host)
@finished = true @finished = true
@scores[client.name] = -9 @scores[client.name] = -9
...@@ -991,6 +997,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -991,6 +997,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
room = ROOM_find_or_create_by_name('M#' + info.pass.slice(8)) room = ROOM_find_or_create_by_name('M#' + info.pass.slice(8))
room.private = true room.private = true
room.arena = settings.modules.arena_mode.mode room.arena = settings.modules.arena_mode.mode
if room.arena == "athletic"
room.max_player = 2
room.welcome = "${athletic_arena_tip}"
when 5 when 5
title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ') title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ')
room = ROOM_find_by_title(title) room = ROOM_find_by_title(title)
...@@ -1304,6 +1313,10 @@ ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)-> ...@@ -1304,6 +1313,10 @@ ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)->
return unless room return unless room
for player in room.players for player in room.players
if player and player.pos == info.pos and player != client if player and player.pos == info.pos and player != client
if room.arena == "athletic"
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
client.destroy()
return true
client.kick_count = if client.kick_count then client.kick_count+1 else 1 client.kick_count = if client.kick_count then client.kick_count+1 else 1
if client.kick_count>=5 and room.random_type if client.kick_count>=5 and room.random_type
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${kicked_by_system}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{client.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
...@@ -1327,6 +1340,35 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> ...@@ -1327,6 +1340,35 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
pos = info.status >> 4 pos = info.status >> 4
is_ready = (info.status & 0xf) == 9 is_ready = (info.status & 0xf) == 9
if pos < room.max_player if pos < room.max_player
if room.arena
room.ready_player_count = 0
for player in room.players
if player.pos == pos
player.is_ready = is_ready
p1 = room.players[0]
p2 = room.players[1]
if !p1 or !p2
if room.waiting_for_player_interval
clearInterval room.waiting_for_player_interval
room.waiting_for_player_interval = null
return
room.waiting_for_player2 = room.waiting_for_player
room.waiting_for_player = null
if p1.is_ready and p2.is_ready
room.waiting_for_player = if p1.is_host then p1 else p2
if !p1.is_ready and p2.is_ready
room.waiting_for_player = p1
if !p2.is_ready and p1.is_ready
room.waiting_for_player = p2
if room.waiting_for_player != room.waiting_for_player2
room.waiting_for_player2 = room.waiting_for_player
room.waiting_for_player_time = 20
room.waiting_for_player_interval = setInterval (()-> wait_room_start_arena(ROOM_all[client.rid]);return), 1000
else if !room.waiting_for_player and room.waiting_for_player_interval
clearInterval room.waiting_for_player_interval
room.waiting_for_player_interval = null
room.waiting_for_player_time = 20
else
room.ready_player_count_without_host = 0 room.ready_player_count_without_host = 0
for player in room.players for player in room.players
if player.pos == pos if player.pos == pos
...@@ -1353,6 +1395,20 @@ wait_room_start = (room, time)-> ...@@ -1353,6 +1395,20 @@ wait_room_start = (room, time)->
player.destroy() player.destroy()
return return
wait_room_start_arena = (room)->
unless !room or room.started or !room.waiting_for_player
room.waiting_for_player_time = room.waiting_for_player_time - 1
if room.waiting_for_player_time > 0
unless room.waiting_for_player_time % 5
ygopro.stoc_send_chat_to_room(room, "#{if room.waiting_for_player_time <= 9 then ' ' else ''}#{room.waiting_for_player_time}${kick_count_down_arena_part1} #{room.waiting_for_player.name} ${kick_count_down_arena_part2}", if room.waiting_for_player_time <= 9 then ygopro.constants.COLORS.RED else ygopro.constants.COLORS.LIGHTBLUE)
else
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
room.waiting_for_player.destroy()
if room.waiting_for_player_interval
clearInterval room.waiting_for_player_interval
room.waiting_for_player_interval = null
return
#tip #tip
ygopro.stoc_send_random_tip = (client)-> ygopro.stoc_send_random_tip = (client)->
if settings.modules.tips.enabled && settings.tips.length if settings.modules.tips.enabled && settings.tips.length
......
// Generated by CoffeeScript 1.12.2 // Generated by CoffeeScript 1.12.2
(function() { (function() {
var Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_players_banned, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, Room, _, addCallback, ban_user, bunyan, cppversion, crypto, date, defaultconfig, execFile, fs, geoip, get_memory_usage, http, http_server, https, https_server, list, load_dialogues, load_tips, log, moment, nconf, net, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, report_to_big_brother, request, requestListener, roomlist, settings, spawn, spawnSync, url, users_cache, wait_room_start, windbot_bin, windbot_parameters, windbot_process, ygopro, zlib; var Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_players_banned, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, Room, _, addCallback, ban_user, bunyan, cppversion, crypto, date, defaultconfig, execFile, fs, geoip, get_memory_usage, http, http_server, https, https_server, list, load_dialogues, load_tips, log, moment, nconf, net, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, report_to_big_brother, request, requestListener, roomlist, settings, spawn, spawnSync, url, users_cache, wait_room_start, wait_room_start_arena, windbot_bin, windbot_parameters, windbot_process, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -605,11 +605,10 @@ ...@@ -605,11 +605,10 @@
} }
Room.prototype["delete"] = function() { Room.prototype["delete"] = function() {
var index, log_rep_id, name, player_ips, player_names, recorder_buffer, ref, replay_id, score, score_array; var end_time, index, log_rep_id, name, player_ips, player_names, recorder_buffer, ref, replay_id, score, score_array;
if (this.deleted) { if (this.deleted) {
return; return;
} }
if (this.started && settings.modules.arena_mode.enabled && this.arena) {
score_array = []; score_array = [];
ref = this.scores; ref = this.scores;
for (name in ref) { for (name in ref) {
...@@ -619,7 +618,12 @@ ...@@ -619,7 +618,12 @@
score: score score: score
}); });
} }
if (score_array.length > 0 && settings.modules.arena_mode.enabled && this.arena) {
if (score_array.length === 2) { if (score_array.length === 2) {
end_time = moment().format();
if (!this.start_time) {
this.start_time = end_time;
}
request.post({ request.post({
url: settings.modules.arena_mode.post_score, url: settings.modules.arena_mode.post_score,
form: { form: {
...@@ -629,7 +633,7 @@ ...@@ -629,7 +633,7 @@
userscoreA: score_array[0].score, userscoreA: score_array[0].score,
userscoreB: score_array[1].score, userscoreB: score_array[1].score,
start: this.start_time, start: this.start_time,
end: moment().format(), end: end_time,
arena: this.arena arena: this.arena
} }
}, (function(_this) { }, (function(_this) {
...@@ -763,7 +767,7 @@ ...@@ -763,7 +767,7 @@
}; };
Room.prototype.disconnect = function(client, error) { Room.prototype.disconnect = function(client, error) {
var index; var index, j, len, player, ref;
if (client.is_post_watcher) { if (client.is_post_watcher) {
ygopro.stoc_send_chat_to_room(this, (client.name + " ${quit_watch}") + (error ? ": " + error : '')); ygopro.stoc_send_chat_to_room(this, (client.name + " ${quit_watch}") + (error ? ": " + error : ''));
index = _.indexOf(this.watchers, client); index = _.indexOf(this.watchers, client);
...@@ -771,6 +775,16 @@ ...@@ -771,6 +775,16 @@
this.watchers.splice(index, 1); this.watchers.splice(index, 1);
} }
} else { } else {
if (this.arena === "athletic" && !this.started && this.players.length === 2) {
ref = this.players;
for (j = 0, len = ref.length; j < len; j++) {
player = ref[j];
if (player.pos !== 7) {
this.scores[player.name] = 0;
}
}
this.scores[client.name] = -9;
}
index = _.indexOf(this.players, client); index = _.indexOf(this.players, client);
if (index !== -1) { if (index !== -1) {
this.players.splice(index, 1); this.players.splice(index, 1);
...@@ -1213,6 +1227,10 @@ ...@@ -1213,6 +1227,10 @@
room = ROOM_find_or_create_by_name('M#' + info.pass.slice(8)); room = ROOM_find_or_create_by_name('M#' + info.pass.slice(8));
room["private"] = true; room["private"] = true;
room.arena = settings.modules.arena_mode.mode; room.arena = settings.modules.arena_mode.mode;
if (room.arena === "athletic") {
room.max_player = 2;
room.welcome = "${athletic_arena_tip}";
}
break; break;
case 5: case 5:
title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' '); title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ');
...@@ -1559,6 +1577,11 @@ ...@@ -1559,6 +1577,11 @@
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref[j]; player = ref[j];
if (player && player.pos === info.pos && player !== client) { if (player && player.pos === info.pos && player !== client) {
if (room.arena === "athletic") {
ygopro.stoc_send_chat_to_room(room, client.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED);
client.destroy();
return true;
}
client.kick_count = client.kick_count ? client.kick_count + 1 : 1; client.kick_count = client.kick_count ? client.kick_count + 1 : 1;
if (client.kick_count >= 5 && room.random_type) { if (client.kick_count >= 5 && room.random_type) {
ygopro.stoc_send_chat_to_room(room, client.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, client.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED);
...@@ -1581,7 +1604,7 @@ ...@@ -1581,7 +1604,7 @@
}); });
ygopro.stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) { ygopro.stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) {
var is_ready, j, len, player, pos, ref, room; var is_ready, j, k, len, len1, p1, p2, player, pos, ref, ref1, room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && room.max_player && client.is_host)) { if (!(room && room.max_player && client.is_host)) {
return; return;
...@@ -1589,13 +1612,54 @@ ...@@ -1589,13 +1612,54 @@
pos = info.status >> 4; pos = info.status >> 4;
is_ready = (info.status & 0xf) === 9; is_ready = (info.status & 0xf) === 9;
if (pos < room.max_player) { if (pos < room.max_player) {
room.ready_player_count_without_host = 0; if (room.arena) {
room.ready_player_count = 0;
ref = room.players; ref = room.players;
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref[j]; player = ref[j];
if (player.pos === pos) { if (player.pos === pos) {
player.is_ready = is_ready; player.is_ready = is_ready;
} }
}
p1 = room.players[0];
p2 = room.players[1];
if (!p1 || !p2) {
if (room.waiting_for_player_interval) {
clearInterval(room.waiting_for_player_interval);
room.waiting_for_player_interval = null;
}
return;
}
room.waiting_for_player2 = room.waiting_for_player;
room.waiting_for_player = null;
if (p1.is_ready && p2.is_ready) {
room.waiting_for_player = p1.is_host ? p1 : p2;
}
if (!p1.is_ready && p2.is_ready) {
room.waiting_for_player = p1;
}
if (!p2.is_ready && p1.is_ready) {
room.waiting_for_player = p2;
}
if (room.waiting_for_player !== room.waiting_for_player2) {
room.waiting_for_player2 = room.waiting_for_player;
room.waiting_for_player_time = 20;
room.waiting_for_player_interval = setInterval((function() {
wait_room_start_arena(ROOM_all[client.rid]);
}), 1000);
} else if (!room.waiting_for_player && room.waiting_for_player_interval) {
clearInterval(room.waiting_for_player_interval);
room.waiting_for_player_interval = null;
room.waiting_for_player_time = 20;
}
} else {
room.ready_player_count_without_host = 0;
ref1 = room.players;
for (k = 0, len1 = ref1.length; k < len1; k++) {
player = ref1[k];
if (player.pos === pos) {
player.is_ready = is_ready;
}
if (!player.is_host) { if (!player.is_host) {
room.ready_player_count_without_host += player.is_ready; room.ready_player_count_without_host += player.is_ready;
} }
...@@ -1606,6 +1670,7 @@ ...@@ -1606,6 +1670,7 @@
}), 1000); }), 1000);
} }
} }
}
}); });
wait_room_start = function(room, time) { wait_room_start = function(room, time) {
...@@ -1633,6 +1698,24 @@ ...@@ -1633,6 +1698,24 @@
} }
}; };
wait_room_start_arena = function(room) {
if (!(!room || room.started || !room.waiting_for_player)) {
room.waiting_for_player_time = room.waiting_for_player_time - 1;
if (room.waiting_for_player_time > 0) {
if (!(room.waiting_for_player_time % 5)) {
ygopro.stoc_send_chat_to_room(room, "" + (room.waiting_for_player_time <= 9 ? ' ' : '') + room.waiting_for_player_time + "${kick_count_down_arena_part1} " + room.waiting_for_player.name + " ${kick_count_down_arena_part2}", room.waiting_for_player_time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE);
}
} else {
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED);
room.waiting_for_player.destroy();
if (room.waiting_for_player_interval) {
clearInterval(room.waiting_for_player_interval);
room.waiting_for_player_interval = null;
}
}
}
};
ygopro.stoc_send_random_tip = function(client) { ygopro.stoc_send_random_tip = function(client) {
if (settings.modules.tips.enabled && settings.tips.length) { if (settings.modules.tips.enabled && settings.tips.length) {
ygopro.stoc_send_chat(client, "Tip: " + settings.tips[Math.floor(Math.random() * settings.tips.length)]); ygopro.stoc_send_chat(client, "Tip: " + settings.tips[Math.floor(Math.random() * settings.tips.length)]);
......
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