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

288 lines
10 KiB
JavaScript
Raw Permalink 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_desk2: 牌桌基础类 =================
说明:
1房间对象由框架负责创建和释放。
2房间对象管理的是人解决诸如谁在房间里谁在哪个位置上谁进了房间谁离开了房间等问题。
3牌桌对象由游戏负责创建牌桌对象会随着房间的释放而释放子游戏不用管牌桌的释放。
4牌桌对象管理的是牌解决诸如哪个位置上发了什么牌出了什么牌等问题。
注意:
1此牌桌类是基础类各子游戏需要在继承此基础类的情况下编写自己的牌桌类。
2子游戏开发人员不能修改该文件。
3子游戏只能调用实例方法不能直接调用类方法。
=========================================================*/
var cls_desk2 = {
//debug服务器地址
// debugserver: "120.26.52.206:8080", //外网地址,开发人员本地调试时使用该地址
debugserver: "10.117.216.66:8080", //内网地址,正式服务器上使用该地址
//创建实例
new: function(object_room){//参数说明object_room 牌桌对应的房间对象
var object = {};
//牌桌与房间互挂
object_room.o_desk = object; //可通过房间对象的o_desk属性访问牌桌对象
object.o_room = object_room; //可通过牌桌对象的o_desk属性访问房间对象
//=============== 在下面定义实例的属性 ===============
//数据
object.data = {}; //要求data必须是纯数据不能在data下面写方法、函数、定时器
//定时器
object.timer = {}; //可根据实际需要在desk.timer下定义多个定时器
//收发包
object.pack = []; //调试状态下记录牌桌的收包发包情况
//bug调试方法
object.debug = {};
//游戏内容方法
object.method = {};
//小局列表。每开一小局则往该数组中添加一个aset小局对象格式如[aset, aset, aset, ...],数组长度即可表示当前是第几小局,数组最后一个小局对象即是当前小局
object.data.asetlist = [];
//=============== 在下面定义实例的方法 ===============
/*1要求实例的方法必须调用类的方法以节省内存资源。
2要求实例的方法必须只用一句代码调用类的方法并将实例对象作为第一个参数传给类方法。
3要求实例的方法名要与类的方法名保持一致。*/
//====================== bug调试 =====================
//记录游戏的收包情况不包括框架的收包要求前端向服务器发包时根据isdebugger参数的配置情况将前端的内存数据一起发上来数据放在pack.data.d里面服务器收到前端发来的包后必须调用该方法
//参数说明pack前端发来的包seat哪个位置发来的包哪个玩家发来的包
object.debug.save_receivepack = function(pack, seat, playerid){
return cls_desk2.save_receivepack(object, pack, seat, playerid);
}
//记录游戏的发包情况(不包括框架的发包),要求服务器向前端发包后一定要调用该方法
/*参数说明pack向前端发的包seat给哪个位置发包给哪个玩家发包。
如果是向所有玩家发包则seat传-1playerid传null
如果是向多个玩家发包则seat传位置数组playerid传玩家id数组*/
object.debug.save_sendpack = function(pack, seat, playerid){
return cls_desk2.save_sendpack(object, pack, seat, playerid);
}
//将当前小局的收发包情况保存到debug服务器上要求小局结算后下一个小局新建前调用此方法
//参数说明callback_succ保存成功的回调函数callback_fail保存失败的回调函数
object.debug.save_pack_curraset = function(callback_succ, callback_fail){
return cls_desk2.save_pack_curraset(object, callback_succ, callback_fail);
}
//输出调试日志到debug服务器上输入后可在debug服务器上或浏览器中查看日志内容
//参数说明dir日志目录名file日志文件名log要输出的日志内容
object.debug.save_log = function(dir, file, log){
return cls_desk2.save_log(object, dir, file, log);
}
//清空debug服务器上的调试日志
//参数说明dir日志目录名file日志文件名
object.debug.clear_log = function(dir, file){
return cls_desk2.clear_log(object, dir, file);
}
//====================== 游戏内容 =====================
//对应的小局类
object.method.AsetClass = function(){
return cls_aset2;
}
//新建一小局
object.method.NewAset = function(){
return cls_desk2.NewAset(object);
}
//大局结算
object.method.CloseAccount = function(){
return cls_desk2.CloseAccount(object);
}
//获取当前小局对象
object.method.CurrAset = function(){
return cls_desk2.CurrAset(object);
}
//获取当前小局是第几小局
object.method.CurrAsetNum = function(){
return cls_desk2.CurrAsetNum(object);
}
//获取下一个有人的位置
object.method.GetNextSeat = function(seat){
return cls_desk2.GetNextSeat(object, seat);
}
return object;
},
//================ 在下面定义类的方法 ================
//===================== bug调试 ======================
//记录服务器收包情况
save_receivepack: function(o_desk, pack, seat, playerid){
try{
if (o_desk.o_room.o_game.method.isdebugger()){ //如果是调试状态下,则记录收包情况
var o_save = {};
o_save.time = min_now(); //记录的时间
o_save.type = 0; //服务器收到前端的发包
o_save.seat = seat; //哪个位置发来的包
o_save.playerid = playerid; //哪个玩家发来的包
o_save.data = {};
//前端内存数据
o_save.data.client = pack.data.d;
//服务器房间内存数据
o_save.data.room = o_desk.o_room.method.get_roominfo();
//服务器牌桌内存数据
o_save.data.desk = min_copyjson(o_desk.data);
for (var i = 0; i < o_save.data.desk.asetlist.length; i++) {
if (i < o_save.data.desk.asetlist.length - 1){
o_save.data.desk.asetlist[i] = null;
};
};
delete pack.data.d;
//接收到的数据包
o_save.pack = pack;
o_desk.pack.push(o_save);
}
}catch(e){};
},
//记录服务器发包情况
save_sendpack: function(o_desk, pack, seat, playerid){
try{
if (o_desk.o_room.o_game.method.isdebugger()){ //如果是调试状态下,则记录发包情况
var o_save = {};
o_save.time = min_now(); //记录的时间
o_save.type = 1; //服务器向前端发包
o_save.seat = seat; //服务器向哪个位置发包
o_save.playerid = playerid; //服务器向哪个玩家发包
o_save.data = {};
//服务器房间内存数据
o_save.data.room = o_desk.o_room.method.get_roominfo();
//服务器牌桌内存数据
o_save.data.desk = min_copyjson(o_desk.data);
for (var i = 0; i < o_save.data.desk.asetlist.length; i++) {
if (i < o_save.data.desk.asetlist.length - 1){
o_save.data.desk.asetlist[i] = null;
};
};
//发送的数据包
o_save.pack = pack;
o_desk.pack.push(o_save);
}
}catch(e){};
},
//将当前小局的收发包情况保存到debug服务器上
save_pack_curraset: function(o_desk, callback_succ, callback_fail){
try{
if (o_desk.o_room.o_game.method.isdebugger()){
for (var i = 0; i < o_desk.pack.length; i++) {
o_desk.pack[i].saveflag = 1;
};
var o_makewartime = new Date(o_desk.o_room.makewartime);
var yyyy = o_makewartime.getFullYear();
var mm = o_makewartime.getMonth() + 1;
var dd = o_makewartime.getDate();
var dir = yyyy + "-" + mm + "-" + dd;
var file = o_desk.o_room.o_game.o_agent.agentid + "-" + o_desk.o_room.o_game.gameid + "-" + o_desk.o_room.roomcode + "-" + o_desk.method.CurrAsetNum() + ".txt";
var data = JSON.stringify(o_desk.pack);
var cfg = {};
cfg.url = "http://" + cls_desk2.debugserver + "/debug.php";
cfg.data = "dir=" + dir + "&file=" + file + "&data=" + data;
cfg.type = "POST";
cfg.success = function(str){
for (var i = 0; i < o_desk.pack.length; i++) {
if (o_desk.pack[i].saveflag){
o_desk.pack.splice(i, 1);
i--;
};
};
if(callback_succ){
callback_succ();
};
};
cfg.error = function(str){
for (var i = 0; i < o_desk.pack.length; i++) {
if (o_desk.pack[i].saveflag){
delete o_desk.pack[i].saveflag;
};
};
console.log(min_now() + " 保存牌局调试数据失败1");
console.log("dir=" + dir);
console.log("file=" + file);
console.log(str);
if(callback_fail){
callback_fail();
};
};
min_http(cfg);
}
}catch(e){
console.log(min_now() + " 保存牌局调试数据失败2");
console.log("dir=" + dir);
console.log("file=" + file);
console.log(e);
};
},
//输出调试日志到debug服务器上
save_log: function(o_desk, dir, file, log){
try{
if (typeof(log) == "object"){
log = JSON.stringify(log);
}
var cfg = {};
cfg.url = "http://" + cls_desk2.debugserver + "/savelog.php";
cfg.data = "dir=" + dir + "&file=" + file + "&data=" + log;
cfg.type = "POST";
cfg.success = function(str){};
cfg.error = function(str){
console.log(min_now() + " 输出调试日志失败");
console.log(str);
};
min_http(cfg);
}catch(e){}
},
//清空debug服务器上的调试日志
clear_log: function(o_desk, dir, file){
try{
var cfg = {};
cfg.url = "http://" + cls_desk2.debugserver + "/clearlog.php";
cfg.data = "dir=" + dir + "&file=" + file;
cfg.type = "POST";
cfg.success = function(str){};
cfg.error = function(str){
console.log(min_now() + " 清空调试日志失败");
console.log(str);
};
min_http(cfg);
}catch(e){}
},
//===================== 游戏内容 ======================
//新建一小局
NewAset: function(o_desk){
var o_aset = o_desk.method.AsetClass().New();
o_desk.data.asetlist.push(o_aset);
return o_aset;
},
//获取当前小局对象
CurrAset: function(o_desk){
return o_desk.data.asetlist[o_desk.data.asetlist.length - 1];
},
//获取当前小局局数
CurrAsetNum: function(o_desk){
return o_desk.data.asetlist.length;
},
//获取下一个有人的位置
GetNextSeat: function(o_desk, seat){
if (seat < 0){
return -1;
}
var seatcount = o_desk.o_room.o_game.seatcount;
if (seat >= seatcount){
return -1;
}
var i = seat;
var o_nextplayer = null;
while (!o_nextplayer){
i = (i + 1) % seatcount;
o_nextplayer = o_desk.o_room.seatlist[i];
}
return i;
},
//大局结算
CloseAccount: function(o_desk){
}
}