/////////////////////////////////////////////////////////////// /////////////// 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; } }