/////////////////////////////////////////////////// ////////// cls_youle_agent_game: 游戏 ////////// /////////////////////////////////////////////////// var cls_youle_agent_game = cls_youle_agent_game || { //构造函数 new: function(o_agent, gameid, gameidx, gamename, minroomcode, maxroomcode, seatcount, makewar, modename){ var game = {}; //基本信息 game.o_agent = o_agent; //代理商 game.gameid = gameid; //游戏id game.idx = gameidx; //游戏的数组下标 game.gamename = gamename; //游戏名称 game.minroomcode = minroomcode; //最小房号 game.maxroomcode = maxroomcode; //最大房号 game.seatcount = seatcount; //房间内的座位数量 game.makewar = makewar; //达成开战条件的人数 game.modename = modename; //服务器模块名称 game.online_p = 0; //在线玩家数 game.online_timer = null; //统计在线人数的定时器 game.online_day = null; //当前日期 game.online_max = null; //当天最大在线人数 game.online_maxtime = null; //当天最大在线人数出现的时间 game.room_day = null; //当前日期 game.room_max = null; //当天最大房间数 game.room_maxtime = null; //当天最大房间数出现的时间 //房号列表 game.roomcodes = []; game.roomcodes.length = maxroomcode - minroomcode + 1; //房号在数组中的位置 game.roomaryid = []; game.roomaryid.length = maxroomcode - minroomcode + 1; for (var i = 0; i < game.roomcodes.length; i++) { game.roomcodes[i] = game.minroomcode + i; game.roomaryid[i] = i; }; //房号列表的有效长度 game.roomcodesvalidlen = maxroomcode - minroomcode + 1; //房间服务器列表 game.servers = []; cls_youle_agent_game.get_roomserverlist(game); //比赛列表 game.matchlist = cls_youle_agent_matchlist.new(game); //统计在线人数的定时器 game.online_timer = setInterval( function(){ var sql = "insert into agent_game_online(aggo_agentid, aggo_gameid, aggo_datetime, aggo_onlineplayer, aggo_onlineroom) values(?,?,?,?,?);"; youle_agent.mysql.execsql("execsql", sql, [game.o_agent.agentid, game.gameid, min_now(), game.online_p, game.maxroomcode - game.minroomcode + 1 - game.roomcodesvalidlen]); }, 1000 * 60 * 10); //方法 game.method = {}; //获取房号对应的房间服务器地址和端口号 game.method.get_roomserver = function(roomcode){ return cls_youle_agent_game.get_roomserver(game, roomcode); } //随机获取新的房间号 game.method.new_roomcode = function(shortcode){ return cls_youle_agent_game.new_roomcode(game, shortcode); } //释放房号 game.method.free_roomcode = function(roomcode){ cls_youle_agent_game.free_roomcode(game, roomcode); } //在线人数变动 game.method.online_p_chang = function(change){ cls_youle_agent_game.online_p_chang(game, change); } //房间数量变动 game.method.roomcodesvalidlen_chang = function(change){ cls_youle_agent_game.roomcodesvalidlen_chang(game, change); } return game; }, //获取房间服务器列表 get_roomserverlist: function(o_game){ var db_callback = function(dbdata){ for (var i = 0; i < dbdata.length; i++) { var _roomserver = {}; _roomserver.minroomcode = parseInt(dbdata[i].minroomcode); _roomserver.maxroomcode = parseInt(dbdata[i].maxroomcode); _roomserver.server = dbdata[i].server; _roomserver.tcpport = parseInt(dbdata[i].tcpport); _roomserver.httpport = parseInt(dbdata[i].httpport); o_game.servers.push(_roomserver); } }; var sql = " select aggr_minroomcode as minroomcode, " + " aggr_maxroomcode as maxroomcode, " + " aggr_server as server, " + " aggr_port_tcp as tcpport, " + " aggr_port_http as httpport " + " from agent_game_room " + " where aggr_agentid = ? and aggr_gameid = ?;"; youle_agent.mysql.execsql("opensql", sql, [o_game.o_agent.agentid, o_game.gameid], db_callback); }, //获取房号对应的房间服务器地址和端口号 get_roomserver: function(o_game, roomcode){ var re = {}; for (var i = 0; i < o_game.servers.length; i++) { if (roomcode >= o_game.servers[i].minroomcode && roomcode <= o_game.servers[i].maxroomcode){ re.server = o_game.servers[i].server; re.tcpport = o_game.servers[i].tcpport; re.httpport = o_game.servers[i].httpport; re.minroomcode = o_game.servers[i].minroomcode; re.maxroomcode = o_game.servers[i].maxroomcode; return re; } } re.server = o_game.o_agent.server; re.tcpport = o_game.o_agent.tcpport; re.httpport = o_game.o_agent.httpport; re.minroomcode = o_game.minroomcode; re.maxroomcode = o_game.maxroomcode; return re; }, //随机获取新的房号 new_roomcode: function(o_game, shortcode){ if (o_game.roomcodesvalidlen == 0){ return null; } //确定房号 var roomcode; var idx; if (shortcode){ if (shortcode < 100000){ //短号,优先分配短号相关的房间号 while (shortcode < 100000){ shortcode = shortcode * 10; } for (var i=1; i<9; i++){ roomcode = shortcode + i; idx = o_game.roomaryid[roomcode - o_game.minroomcode]; if (idx < o_game.roomcodesvalidlen){ break; } else { roomcode = null; idx = null; } } } else { //长号,取制定房号 roomcode = shortcode; idx = o_game.roomaryid[roomcode - o_game.minroomcode]; } } //分配随机房间号 if (!roomcode){ for (var i=1; i<9; i++){ //在有效房号数组中随机数组下标 idx = min_random(0, o_game.roomcodesvalidlen - 1); roomcode = o_game.roomcodes[idx]; //如果是1,2,3这样的房号则重新取房号,1、2、3这样房号预留给短号 if (roomcode % 10 > 3 || roomcode % 10 < 1) { break; } } } //将有效数组的最后一个房号与该房号互换位置 if (idx < o_game.roomcodesvalidlen - 1) { var lastroomcode = o_game.roomcodes[o_game.roomcodesvalidlen - 1]; o_game.roomcodes[idx] = lastroomcode; o_game.roomaryid[lastroomcode - o_game.minroomcode] = idx; o_game.roomcodes[o_game.roomcodesvalidlen - 1] = roomcode; o_game.roomaryid[roomcode - o_game.minroomcode] = o_game.roomcodesvalidlen - 1; }; //有效数组长度减1 o_game.method.roomcodesvalidlen_chang(-1); return roomcode; }, //释放房号 free_roomcode: function(o_game, roomcode){ var idx = o_game.roomaryid[roomcode - o_game.minroomcode]; if (idx > o_game.roomcodesvalidlen){ var lastroomcode = o_game.roomcodes[o_game.roomcodesvalidlen]; o_game.roomcodes[idx] = lastroomcode; o_game.roomaryid[lastroomcode - o_game.minroomcode] = idx; o_game.roomcodes[o_game.roomcodesvalidlen] = roomcode; o_game.roomaryid[roomcode - o_game.minroomcode] = o_game.roomcodesvalidlen; o_game.method.roomcodesvalidlen_chang(1); } else if (idx == o_game.roomcodesvalidlen){ o_game.method.roomcodesvalidlen_chang(1); } //如果是星星争霸场的房间则在星星争霸场中删除该房间 if (o_game.sharerooms_player){ min_ary_delval(o_game.sharerooms_player, roomcode, "roomcode"); } if (o_game.sharerooms_system == roomcode){ min_ary_delval(o_game.sharerooms_system, roomcode, "roomcode"); } }, //在线人数变动 online_p_chang: function(o_game, change){ o_game.online_p = o_game.online_p + change; if (!o_game.online_max){ o_game.online_max = o_game.online_p; o_game.online_day = min_day(); o_game.online_maxtime = min_now(); } else { if (min_day() == o_game.online_day){ //同一天 if (o_game.online_p > o_game.online_max){ o_game.online_max = o_game.online_p; o_game.online_maxtime = min_now(); } } else { //不是同一天 //保存上一天的最大在线人数 var sql = "call cp_report_game_day(?,?,?,?,?,?);"; youle_agent.mysql.execsql("execsql", sql, [o_game.o_agent.agentid, o_game.gameid, o_game.online_day, 3, o_game.online_max, o_game.online_maxtime]); o_game.online_max = o_game.online_p; o_game.online_day = min_day(); o_game.online_maxtime = min_now(); } } }, //房间数量变动 roomcodesvalidlen_chang: function(o_game, change){ o_game.roomcodesvalidlen = o_game.roomcodesvalidlen + change; //当前的房间数量 var roomcount = o_game.maxroomcode - o_game.minroomcode + 1 - o_game.roomcodesvalidlen; //测试用 if (roomcount < 0){ console.log(min_now() + "房号管理错误|||||||||||||||||||||||| agentid:" + o_game.o_agent.agentid + ",gameid:" + o_game.gameid); } if (!o_game.room_max){ o_game.room_max = roomcount; o_game.room_day = min_day(); o_game.room_maxtime = min_now(); } else { if (min_day() == o_game.room_day){ //同一天 if (roomcount > o_game.room_max){ o_game.room_max = roomcount; o_game.room_maxtime = min_now(); } } else { //不是同一天 //保存上一天的最大房间数 var sql = "call cp_report_game_day(?,?,?,?,?,?);"; youle_agent.mysql.execsql("execsql", sql, [o_game.o_agent.agentid, o_game.gameid, o_game.room_day, 4, o_game.room_max, o_game.room_maxtime]); o_game.room_max = roomcount; o_game.room_day = min_day(); o_game.room_maxtime = min_now(); } } } }