288 lines
10 KiB
JavaScript
288 lines
10 KiB
JavaScript
/*================= 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传-1,playerid传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){
|
||
|
||
}
|
||
}
|