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

271 lines
9.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////
////////// 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];
//如果是123这样的房号则重新取房号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();
}
}
}
}