271 lines
9.3 KiB
JavaScript
271 lines
9.3 KiB
JavaScript
///////////////////////////////////////////////////
|
|
////////// 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();
|
|
}
|
|
}
|
|
}
|
|
}
|