/*================= 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){ } }