Files
youlegames/codes/games/sales_service/youle/server_agent/class.match.js
2026-02-04 23:47:45 +08:00

589 lines
21 KiB
JavaScript

///////////////////////////////////////////////////////////////
/////////////// cls_youle_agent_match: 比赛 /////////////////
///////////////////////////////////////////////////////////////
var cls_youle_agent_match = cls_youle_agent_match || {
//构造函数
new: function(o_game, o_matchlist, o_setting){
var match = {};
match.o_game = o_game;
match.o_matchlist = o_matchlist;
match.id = o_setting.id;
match.roomtype = o_setting.roomtype;
match.matchname = o_setting.matchname;
match.imageurl = o_setting.imageurl;
match.playercount = o_setting.playercount;
match.playercount2= o_setting.playercount2;
match.bean = o_setting.bean;
match.roomcard = o_setting.roomcard;
match.topcount = o_setting.topcount;
match.circulation = o_setting.circulation;
match.interval = o_setting.interval;
match.gradename = o_setting.gradename;
match.memo1 = o_setting.memo1;
match.memo2 = o_setting.memo2;
match.memo3 = o_setting.memo3;
match.haverobot = o_setting.haverobot;
if (o_setting.ranking){
match.sysgrade = o_setting.ranking;
}
//该比赛的第几个循环
if (match.circulation){
if ((new Date()).getTime() < (new Date(o_setting.beginTime)).getTime()){
match.idx = 1;
match.beginTime = o_setting.beginTime;
match.endTime = o_setting.endTime;
} else if ((new Date()).getTime() <= (new Date(o_setting.endTime)).getTime()){
match.idx = 1;
match.beginTime = o_setting.beginTime;
match.endTime = o_setting.endTime;
} else {
match.idx = parseInt(((new Date()).getTime() - 1 - (new Date(o_setting.endTime)).getTime()) / ((new Date(o_setting.endTime)).getTime() - (new Date(o_setting.beginTime)).getTime() + o_setting.interval * 1000)) + 2;
match.beginTime = min_timestampToTime((new Date(o_setting.endTime)).getTime() + o_setting.interval * 1000 * (match.idx - 1) + ((new Date(o_setting.endTime)).getTime() - (new Date(o_setting.beginTime)).getTime()) * (match.idx - 2));
match.endTime = min_timestampToTime((new Date(match.beginTime)).getTime() + (new Date(o_setting.endTime)).getTime() - (new Date(o_setting.beginTime)).getTime());
}
if (match.idx > match.circulation + 1){
return null;
}
} else {
if ((new Date()).getTime() > (new Date(o_setting.endTime)).getTime()){
return null;
}
match.idx = 1;
match.beginTime = o_setting.beginTime;
match.endTime = o_setting.endTime;
}
match.isstart = 0;
match.playerlist = [];
match.ranklist = [];
//方法
match.method = {};
//定时开始游戏
match.method.start_game = function(){
return cls_youle_agent_match.start_game(match);
};
//随机上一个系统成绩
match.method.add_sysgrade = function(){
cls_youle_agent_match.add_sysgrade(match);
};
//开启系统成绩定时器
match.method.start_add_sysgrade_timer = function(){
cls_youle_agent_match.start_add_sysgrade_timer(match);
};
match.timer_start = min_ontime(match.method.start_game, 6 * 1000);
return match;
},
//定时开始游戏
start_game: function(o_match){
var o_game = o_match.o_game;
var o_agent = o_game.o_agent;
var config_close = youle_platform.config.method.get_paravalue("isclose", o_agent.agentid, o_game.gameid);
if (o_agent.isclose || config_close == 2){
return;
};
var do_start = function(){
var seatcount = youle_room.import.makewar_playercount(o_game, o_match.roomtype);
if (!seatcount){
seatcount = o_game.seatcount;
}
while ((o_match.playerlist.length >= seatcount) ||
(o_match.haverobot == 1 && o_match.playerlist.length > 0)){
var _roomsvr_room = null;
var playercount = 0;
var playerbeansum = 0;
var playeridlist = [];
var playernamelist = [];
var playeravatarlist = [];
for (var i = 1; i <= seatcount; i++) {
if (o_match.playerlist.length > 0){
var idx = min_random(0, o_match.playerlist.length - 1);
var playerid = o_match.playerlist[idx];
var o_player = o_agent.method.find_player(playerid);
if (o_player){
var o_gameinfo = o_player.method.get_gameinfo(o_game);
if (o_gameinfo) {
if (!o_gameinfo.roomcode){
if (_roomsvr_room){
var msg = {};
msg.app = youle_agent.app.appname;
msg.route = youle_agent.app.youle_room.routename;
msg.rpc = "self_join_room";
msg.data = {};
msg.data.playerid = playerid;
msg.data.nickname = o_player.nickname;
msg.data.avatar = o_player.avatar;
msg.data.sex = o_player.sex;
msg.data.playertype = o_player.playertype;
msg.data.ip = o_gameinfo.ip;
msg.data.conmode = o_gameinfo.conmode;
msg.data.fromid = o_gameinfo.fromid;
msg.data.agentid = o_agent.agentid;
msg.data.gameid = o_game.gameid;
msg.data.roomcode = _roomsvr_room.roomcode;
msg.data.playerroomcard = o_player.roomcard;
msg.data.playerbean = o_player.bean;
msg.data.address = o_player.address;
msg.data.latitude = o_player.latitude;
msg.data.longitude = o_player.longitude;
//房间服务器与代理商服务器是同一地址
var roomserver_data = youle_agent.app.youle_room[msg.rpc](msg);
//返回数据
if (roomserver_data.data.state == 0){
//加入房间成功
o_gameinfo.roomcode = _roomsvr_room.roomcode;
delete o_gameinfo.matchid;
delete o_gameinfo.matchidx;
playercount = playercount + 1;
playerbeansum = playerbeansum + o_player.bean;
playeridlist.push(o_player.playerid);
playernamelist.push(o_player.nickname);
playeravatarlist.push(o_player.avatar);
var pack = {};
pack.ip = o_gameinfo.match_ip;
pack.conmode = o_gameinfo.match_conmode;
pack.fromid = o_gameinfo.match_fromid;
pack.app = "youle";
pack.route = "agent";
pack.rpc = "self_join_room";
pack.data = roomserver_data.data;
pack.data.matchid = o_match.id;
pack.data.matchidx = o_match.idx;
youle_agent.app.SendPack(pack);
}
} else {
var roomcode = o_game.method.new_roomcode();
if (roomcode){
var o_roomserver = o_game.method.get_roomserver(roomcode);
var msg = {};
msg.app = youle_agent.app.appname;
msg.route = youle_agent.app.youle_room.routename;
msg.rpc = "create_room";
msg.data = {};
msg.data.agent = {};
msg.data.agent.agentid = o_agent.agentid;
msg.data.agent.name = o_agent.agentname;
msg.data.agent.server = o_agent.server;
msg.data.agent.tcpport = o_agent.tcpport;
msg.data.agent.httpport = o_agent.httpport;
msg.data.agent.freeroom = o_agent.freeroom;
msg.data.game = {};
msg.data.game.gameid = o_game.gameid;
msg.data.game.name = o_game.gamename;
msg.data.game.seatcount = o_game.seatcount;
msg.data.game.makewar = o_game.makewar;
msg.data.game.modename = o_game.modename;
msg.data.game.server = o_roomserver.server;
msg.data.game.tcpport = o_roomserver.tcpport;
msg.data.game.httpport = o_roomserver.httpport;
msg.data.game.minroomcode = o_roomserver.minroomcode;
msg.data.game.maxroomcode = o_roomserver.maxroomcode;
msg.data.player = {};
msg.data.player.playerid = playerid;
msg.data.player.nickname = o_player.nickname;
msg.data.player.avatar = o_player.avatar;
msg.data.player.sex = o_player.sex;
msg.data.player.playertype = o_player.playertype;
msg.data.player.ip = o_gameinfo.ip;
msg.data.player.conmode = o_gameinfo.conmode;
msg.data.player.fromid = o_gameinfo.fromid;
msg.data.player.address = o_player.address;
msg.data.player.latitude = o_player.latitude;
msg.data.player.longitude = o_player.longitude;
msg.data.player.bean = o_player.bean;
var needroomcard = youle_agent.import.createroom_needroomcard(o_game, o_match.roomtype);
//获取总局数
var asetcount = youle_agent.import.createroom_asetcount(o_game, o_match.roomtype);
//获取豆豆下限
var beanfloor = youle_agent.import.createroom_beanfloor(o_game, o_match.roomtype);
//获取房间类型
var roommode = youle_agent.import.createroom_roommode(o_game, o_match.roomtype);
//获取星星场倍数
var beanmult = youle_agent.import.createroom_beanmult(o_game, o_match.roomtype);
//不是星星场
if (!roommode){
beanmult = 0;
}
//玩家是否需要准备
var needprepare = youle_agent.import.createroom_needprepare(o_game, o_match.roomtype);
//比赛场写死不需要准备
needprepare = 0;
msg.data.room = {};
msg.data.room.roomcode = roomcode;
msg.data.room.roomtype = o_match.roomtype;
msg.data.room.needroomcard = needroomcard;
msg.data.room.asetcount = asetcount;
msg.data.room.infinite = 0;
msg.data.room.roommode = roommode;
msg.data.room.beanfloor = beanfloor;
msg.data.room.beanmult = beanmult;
msg.data.room.needprepare = needprepare;
msg.data.room.advanced_type= 0;
msg.data.room.advanced_teabean = 0;
msg.data.room.match_id = o_match.id;
msg.data.room.match_idx = o_match.idx;
if (o_roomserver.server == o_agent.server){
//房间服务器与代理商服务器是同一地址
var roomserver_data = youle_agent.app.youle_room[msg.rpc](msg);
//返回数据
if (roomserver_data.data.state == 0){
//加入房间成功
o_gameinfo.roomcode = roomcode;
delete o_gameinfo.matchid;
delete o_gameinfo.matchidx;
playercount = playercount + 1;
playerbeansum = playerbeansum + o_player.bean;
playeridlist.push(o_player.playerid);
playernamelist.push(o_player.nickname);
playeravatarlist.push(o_player.avatar);
var pack = {};
pack.ip = o_gameinfo.match_ip;
pack.conmode = o_gameinfo.match_conmode;
pack.fromid = o_gameinfo.match_fromid;
pack.app = "youle";
pack.route = "agent";
pack.rpc = "create_room";
pack.data = roomserver_data.data;
pack.data.matchid = o_match.id;
pack.data.matchidx = o_match.idx;
youle_agent.app.SendPack(pack);
var _roomsvr_agent = youle_room.agents.method.find_agent(o_agent.agentid);
var _roomsvr_game = _roomsvr_agent.method.find_game(o_game.gameid);
_roomsvr_room = _roomsvr_game.method.find_room(roomcode);
}
}
}
}
}
}
o_match.playerlist.splice(idx, 1);
} else {
o_match.playerlist.splice(idx, 1);
}
} else {
//加入机器人
var robot_playerid = null;
for (var j = 1; j < 10; j++) {
robot_playerid = min_random(200000, 899999);
if (min_ary_indexof(playeridlist, robot_playerid) > -1){
robot_playerid = null;
} else {
break;
}
}
if (robot_playerid == null){
return;
}
var idx
var robot_nickname = null;
for (var j = 1; j < 10; j++) {
idx = min_random(0, o_agent.robot_nicknamelist.length - 1);
robot_nickname = o_agent.robot_nicknamelist[idx];
if (min_ary_indexof(playernamelist, robot_nickname) > -1){
robot_nickname = null;
} else {
break;
}
}
if (robot_nickname == null){
return;
}
var robot_avatar = null;
for (var j = 1; j < 10; j++) {
idx = min_random(0, o_agent.robot_avatarlist.length - 1);
robot_avatar = o_agent.robot_avatarlist[idx];
if (min_ary_indexof(playeravatarlist, robot_avatar) > -1){
robot_avatar = null;
} else {
break;
}
}
if (robot_avatar == null){
return;
}
var robot_sex = min_random(1, 2);
var robot_ip = min_random(10, 240) + "." + min_random(10, 240) + "." + min_random(10, 240) + "." + min_random(10, 240);
var robot_bean = parseInt(playerbeansum / playercount) + min_random(100, 3000);
if (!robot_bean){
robot_bean = 0;
}
var o_robot = cls_youle_room_player.new(robot_playerid, robot_nickname, robot_avatar, robot_sex, 0, robot_ip, 0, null, null);
o_robot.bean = robot_bean;
o_robot.isrobot = 1;
for (var j = 0; j < _roomsvr_room.seatlist.length; j++) {
if (!_roomsvr_room.seatlist[j]){
// console.log(_roomsvr_room.roomcode + "比赛场加入机器人" + robot_playerid);
o_robot.method.enter_room(_roomsvr_room, j, 0);
if (_roomsvr_room.battlestate){
youle_room.import.player_enter(_roomsvr_room, j);
}
youle_room.return.self_join_room({}, o_robot, robot_bean);
playeridlist.push(o_robot.playerid);
playernamelist.push(o_robot.nickname);
playeravatarlist.push(o_robot.avatar);
if (_roomsvr_room.needprepare){
(function(){
var o_robot2 = o_robot;
o_robot2.tmr_prepare = min_ontimeout(
function(){
if (!o_robot2.gameinfo.isprepare){
var pack = {};
pack.app = "youle";
pack.route = "room";
pack.rpc = "player_prepare";
pack.data = {};
pack.data.agentid = o_robot2.gameinfo.o_room.o_game.o_agent.agentid;
pack.data.playerid = o_robot2.playerid;
pack.data.gameid = o_robot2.gameinfo.o_room.o_game.gameid;
pack.data.roomcode = o_robot2.gameinfo.o_room.roomcode;
youle_room.player_prepare(pack);
}
}, min_random(2000, 4000));
})(o_robot);
}
break;
}
}
}
}
}
}
if ((new Date()).getTime() >= (new Date(o_match.beginTime)).getTime() &&
(new Date()).getTime() <= (new Date(o_match.endTime)).getTime()){
if (!o_match.isstart){
if (o_match.playerlist.length >= o_match.playercount || o_match.haverobot == 1){
do_start();
o_match.isstart = 1;
}
} else {
if (o_match.playerlist.length >= o_match.playercount2 || o_match.haverobot == 1){
do_start();
}
}
} else if ((new Date()).getTime() > (new Date(o_match.endTime)).getTime()){
cls_youle_room_backup.deletebackup_match(o_match);
min_closetime(o_match.timer_start);
if (o_match.timer_add_sysgrade){
min_closetime(o_match.timer_add_sysgrade);
}
if (o_match.ranklist.length > 0){
var ary_playerid = "";
var ary_nickname = "";
var ary_avatar = "";
var ary_roomcode = "";
var ary_overtime = "";
var ary_grade = "";
var ary_isrobot = "";
for (var i = 0; i < o_match.ranklist.length; i++) {
if (i == 0){
ary_playerid = o_match.ranklist[i].playerid;
ary_nickname = o_match.ranklist[i].nickname;
ary_avatar = o_match.ranklist[i].avatar;
ary_roomcode = o_match.ranklist[i].roomcode;
ary_overtime = o_match.ranklist[i].overtime;
ary_grade = o_match.ranklist[i].grade;
ary_isrobot = o_match.ranklist[i].isr;
} else {
ary_playerid = ary_playerid + "," + o_match.ranklist[i].playerid;
ary_nickname = ary_nickname + "," + o_match.ranklist[i].nickname;
ary_avatar = ary_avatar + "," + o_match.ranklist[i].avatar;
ary_roomcode = ary_roomcode + "," + o_match.ranklist[i].roomcode;
ary_overtime = ary_overtime + "," + o_match.ranklist[i].overtime;
ary_grade = ary_grade + "," + o_match.ranklist[i].grade;
ary_isrobot = ary_isrobot + "," + o_match.ranklist[i].isr;
}
};
var sql = "call cp_game_save_matchranking(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
youle_room.mysql_grade.execsql("execsql", sql, [o_agent.agentid, o_game.gameid, o_match.id, o_match.idx, o_match.matchname, o_match.beginTime, o_match.endTime, JSON.stringify(o_match.roomtype), o_match.imageurl, o_match.playercount, o_match.playercount2, o_match.bean, o_match.roomcard, o_match.topcount, o_match.circulation, o_match.interval, o_match.gradename, o_match.memo1, o_match.memo2, o_match.memo3, JSON.stringify(o_match.ranklist), ary_playerid, ary_nickname, ary_avatar, ary_roomcode, ary_overtime, ary_grade, ary_isrobot]);
}
var idx = min_ary_indexof(o_match.o_matchlist.list, o_match.id, "id");
if (idx > -1){
o_match.o_matchlist.list.splice(idx, 1);
}
}
},
//随机上一个系统成绩
add_sysgrade: function(o_match){
if (o_match.sysgrade && o_match.sysgrade.length > 0){
var robot_playerid = null;
for (var j = 1; j < 10; j++) {
robot_playerid = min_random(200000, 899999);
if (min_ary_indexof(o_match.ranklist, robot_playerid, "playerid") > -1){
robot_playerid = null;
} else {
break;
}
}
if (robot_playerid == null){
return;
}
var o_agent = o_match.o_game.o_agent;
var robot_nickname = null;
for (var j = 1; j < 10; j++) {
var idx = min_random(0, o_agent.robot_nicknamelist.length - 1);
robot_nickname = o_agent.robot_nicknamelist[idx];
if (min_ary_indexof(o_match.ranklist, robot_nickname, "nickname") > -1){
robot_nickname = null;
} else {
break;
}
}
if (robot_nickname == null){
return;
}
var robot_avatar = null;
for (var j = 1; j < 10; j++) {
var idx = min_random(0, o_agent.robot_avatarlist.length - 1);
robot_avatar = o_agent.robot_avatarlist[idx];
if (min_ary_indexof(o_match.ranklist, robot_avatar, "avatar") > -1){
robot_avatar = null;
} else {
break;
}
}
if (robot_avatar == null){
return;
}
var rand = min_random(0, o_match.sysgrade.length - 1);
var robot_grade = min_random(o_match.sysgrade[rand].min, o_match.sysgrade[rand].max);
var o_sysplayer = {};
o_sysplayer.playerid = robot_playerid;
o_sysplayer.nickname = robot_nickname;
o_sysplayer.avatar = robot_avatar;
o_sysplayer.roomcode = min_random(100000, 999999);
o_sysplayer.overtime = min_now();
o_sysplayer.grade = robot_grade;
o_sysplayer.isr = 2;
var isfound = false;
for (var j = 0; j < o_match.ranklist.length; j++) {
if (o_sysplayer.grade > o_match.ranklist[j].grade){
o_match.ranklist.splice(j, 0, o_sysplayer);
if (o_match.ranklist.length > parseInt(o_match.topcount)){
o_match.ranklist.length = parseInt(o_match.topcount);
}
isfound = true;
break;
}
}
if (!isfound){
if (o_match.ranklist.length < parseInt(o_match.topcount)){
o_match.ranklist.push(o_sysplayer);
}
}
o_match.sysgrade[rand].count = o_match.sysgrade[rand].count - 1;
if (o_match.sysgrade[rand].count == 0){
o_match.sysgrade.splice(rand, 1);
}
cls_youle_room_backup.backup_match(o_match);
if (o_match.sysgrade.length == 0){
if (o_match.timer_add_sysgrade){
min_closetime(o_match.timer_add_sysgrade);
o_match.timer_add_sysgrad = null;
}
}
}
},
//开启系统成绩定时器
start_add_sysgrade_timer: function(o_match){
if (o_match.sysgrade && !o_match.timer_add_sysgrade){
var sum_count = 0;
for (var i = 0; i < o_match.sysgrade.length; i++) {
sum_count = sum_count + o_match.sysgrade[i].count;
};
var interval = (new Date(o_match.endTime)).getTime() - (new Date()).getTime();
if (interval > 0 && sum_count > 0){
interval = parseInt(interval / sum_count);
o_match.timer_add_sysgrade = min_ontime(o_match.method.add_sysgrade, interval);
}
}
}
}
///////////////////////////////////////////////////////////////
/////////// cls_youle_agent_matchlist: 比赛列表 //////////
///////////////////////////////////////////////////////////////
var cls_youle_agent_matchlist = cls_youle_agent_matchlist || {
//构造函数
new: function(o_game) {
var matchlist = {};
matchlist.o_game = o_game;
matchlist.list = [];
matchlist.method = {};
//载入一个比赛
matchlist.method.load_match = function(o_setting){
return cls_youle_agent_matchlist.load_match(matchlist, o_setting);
};
//查找一个比赛
matchlist.method.find_match = function(id, idx){
return cls_youle_agent_matchlist.find_match(matchlist, id, idx);
};
return matchlist;
},
//载入一个比赛
load_match: function(o_matchlist, o_setting){
var o_match;
var idx = min_ary_indexof(o_matchlist.list, o_setting.id, "id");
if (idx == -1) {
o_match = cls_youle_agent_match.new(o_matchlist.o_game, o_matchlist, o_setting);
if (o_match){
o_matchlist.list.push(o_match);
}
} else {
o_match = o_matchlist.list[idx];
}
return o_match;
},
//查找一个比赛
find_match: function(o_matchlist, id, idx){
var i = min_ary_indexof(o_matchlist.list, id, "id");
if (i > -1){
if (o_matchlist.list[i].idx == idx){
return o_matchlist.list[i];
}
}
return null;
}
}