/////////////////////////////////////////////////// /////////////// cls_desk: 牌桌基础类 ////////////// /////////////////////////////////////////////////// var cls_desk = cls_desk || { //创建单个牌桌实例 new: function(o_room){ /* 参数说明: o_room 牌桌对应的房间对象 补充说明: 1,房间对象由框架负责创建和释放。 2,房间对象管理的是人,解决诸如谁在房间里,谁在哪个位置上,谁进了房间,谁离开了房间等问题。 3,牌桌对象由游戏负责创建,牌桌对象会随着房间的释放而释放,子游戏不用管牌桌的释放。 4,牌桌对象管理的是牌,解决诸如哪个位置上发了什么牌,出了什么牌等问题。 5,此牌桌类是基础牌桌类,各子游戏需要在继承此基础类的情况下编写自己的牌桌类。 */ var desk = {}; //牌桌与房间互挂 o_room.o_desk = desk; //可通过房间对象的o_desk属性访问牌桌对象 desk.o_room = o_room; //可通过牌桌对象的o_desk属性访问房间对象 //数据 desk.data = {}; //要求data必须是纯数据,不能在data下面写方法、函数、定时器 //定时器 desk.timer = {}; //可根据实际需要在desk.timer下定义多个定时器 //收发包 desk.pack = []; //调试状态下记录牌桌的收包发包情况 //流程方法 desk.flow = {}; //算法方法 desk.arith = {}; //////////在下面定义实例的属性 //数据-小局列表 desk.data.asetlist = []; //每开一小局则往该数组中添加一个aset小局对象,[aset, aset, aset, ...], [{}, {}, {}, ...], [[], [], [], ...],数组长度即可表示当前是第几小局,数组最后一个小局对象即是当前小局 /////////在下面定义实例的方法,要求实例的方法必须调用类的方法,以节省内存资源,要求实例的方法名要与类的方法名保持一致 //记录游戏的收包情况(不包括框架的收包),要求前端向服务器发包时根据配置参数的设置情况将前端内存数据一起发上来,数据放在pack.data.d里面,服务器收到包后必须调用该方法 desk.flow.save_receivepack = function(pack, seat, playerid){ return cls_desk.save_receivepack(desk, pack, seat, playerid); } //记录游戏的发包情况(不包括框架的发包),要求服务器向前端发包后一定要调用该方法 desk.flow.save_sendpack = function(pack, seat, playerid){ return cls_desk.save_sendpack(desk, pack, seat, playerid); } //将当前小局的收发包情况保存成TXT desk.flow.save_pack_curraset = function(callback_succ, callback_fail){ return cls_desk.save_pack_curraset(desk, callback_succ, callback_fail); } //输出日志 desk.flow.save_log = function(dir, file, log){ return cls_desk.save_log(desk, dir, file, log); } //清日志 desk.flow.clear_log = function(dir, file){ return cls_desk.clear_log(desk, dir, file); } //获取当前小局对象 desk.flow.get_curraset = function(){ return cls_desk.get_curraset(desk); //必须调用类的方法,且需要将实例对象作为参数传入类方法,这里只能写一句代码 } //获取当前小局局数 desk.flow.get_currasetnum = function(){ return cls_desk.get_currasetnum(desk); //必须调用类的方法,且需要将实例对象作为参数传入类方法,这里只能写一句代码 } return desk; }, ////////////以下都是类的方法,要求所有的逻辑算法全部都要用类方法来实现 //记录收包情况 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; //玩家id 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; //玩家id 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){}; }, //将当前小局的收发包情况保存成TXT 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.flow.get_currasetnum() + ".txt"; var data = JSON.stringify(o_desk.pack); var cfg = {}; // cfg.url = "http://120.26.52.206:8080/debug.php"; cfg.url = "http://10.117.216.66:8080/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); }; }, //输出日志 save_log: function(o_desk, dir, file, log){ try{ var cfg = {}; // cfg.url = "http://120.26.52.206:8080/savelog.php"; cfg.url = "http://10.117.216.66:8080/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() + " 输出日志失败:" + dir + "/" + file); console.log(str); }; min_http(cfg); }catch(e){} }, //清日志 clear_log: function(o_desk, dir, file){ try{ var cfg = {}; // cfg.url = "http://120.26.52.206:8080/clearlog.php"; cfg.url = "http://10.117.216.66:8080/clearlog.php"; cfg.data = "dir=" + dir + "&file=" + file; cfg.type = "POST"; cfg.success = function(str){}; cfg.error = function(str){ console.log(min_now() + " 清空日志失败:" + dir + "/" + file); console.log(str); }; min_http(cfg); }catch(e){} }, //获取当前小局对象 get_curraset: function(o_desk){ return o_desk.data.asetlist[desk.data.asetlist.length - 1]; }, //获取当前小局局数 get_currasetnum: function(o_desk){ return o_desk.data.asetlist.length; } }