864 lines
26 KiB
JavaScript
864 lines
26 KiB
JavaScript
///////////////////////////////////////////////////
|
||
////////// cls_youle_erqiwang_paiju: 牌局 /////////
|
||
///////////////////////////////////////////////////
|
||
var cls_youle_erqiwang_paiju = cls_youle_erqiwang_paiju || {
|
||
|
||
new: function(o_desk, firstseat) {
|
||
var paiju = {};
|
||
o_desk.paiju_list.push(paiju);
|
||
|
||
// ================= 实例的私有属性 ================= //
|
||
//发牌过程中待发的位置列表
|
||
var tmpdeal = [];
|
||
//三家需要各发28张牌
|
||
for (var i = 0; i < 28; i++){
|
||
tmpdeal.push(0); //0表示第一个玩家的位置
|
||
tmpdeal.push(1); //1表示第二个玩家的位置
|
||
tmpdeal.push(2); //2表示第三个玩家的位置
|
||
}
|
||
//8张底牌
|
||
for (var i = 0; i < 8; i++){
|
||
tmpdeal.push(-1); //-1 表示是底牌
|
||
}
|
||
|
||
// ================= 实例的私有方法 ================= //
|
||
|
||
//初始化座位列表
|
||
var init_seatlist = function(){
|
||
//第一层是玩家列表,与位置序号对应
|
||
//第二层前4个数组是花色列表,与花色-1对应
|
||
//第三层的第一位是无该花色的牌标志
|
||
//第三层的第二位是该花色无对标志
|
||
//第二层第5个数组是报副情况
|
||
//第三层的第一位是剩余主牌数量
|
||
//第三层的第二位是剩余主牌对子
|
||
//0号位
|
||
paiju.seatlist.push([[0,0],[0,0],[0,0],[0,0],[-1,-1]]);
|
||
//1号位
|
||
paiju.seatlist.push([[0,0],[0,0],[0,0],[0,0],[-1,-1]]);
|
||
//2号位
|
||
paiju.seatlist.push([[0,0],[0,0],[0,0],[0,0],[-1,-1]]);
|
||
}
|
||
|
||
//初始化牌列表并发牌
|
||
var init_cards = function(){
|
||
//两副牌
|
||
for (var i = 1; i <= 2; i++){
|
||
//四种花色
|
||
for (var j = 1; j <= 4; j++){
|
||
for (var k = 1; k <= 13; k++){
|
||
//牌id
|
||
var id = (i - 1) * 54 + (j - 1) * 13 + k - 1;
|
||
//分值
|
||
var score = 0;
|
||
//发牌状态
|
||
var dealowner = 0;
|
||
//特殊处理
|
||
switch (k)
|
||
{
|
||
case 5:
|
||
score = 5;
|
||
break;
|
||
case 10:
|
||
score = 10;
|
||
break;
|
||
case 13:
|
||
score = 10;
|
||
break;
|
||
case 3:
|
||
dealowner = -1;
|
||
break;
|
||
case 4:
|
||
dealowner = -1;
|
||
break;
|
||
}
|
||
var pai = cls_youle_erqiwang_pai.new(id, j, k, score, dealowner);
|
||
paiju.cards.push(pai);
|
||
//发牌
|
||
if (k != 3 && k != 4){
|
||
do_dealpai(pai);
|
||
}
|
||
}
|
||
}
|
||
|
||
//小王
|
||
var pai = cls_youle_erqiwang_pai.new((i - 1) * 54 + 53 - 1, 5, 53, 0, 0);
|
||
paiju.cards.push(pai);
|
||
do_dealpai(pai);
|
||
|
||
//大王
|
||
var pai = cls_youle_erqiwang_pai.new((i - 1) * 54 + 54 - 1, 5, 54, 0, 0);
|
||
paiju.cards.push(pai);
|
||
do_dealpai(pai);
|
||
}
|
||
}
|
||
|
||
//将单张牌随机发到玩家手中或成为底牌
|
||
var do_dealpai = function(o_pai){
|
||
var idx = min_random(0, tmpdeal.length - 1);
|
||
if (tmpdeal[idx] == -1) { //底牌
|
||
o_pai.dealowner = 0;
|
||
} else {
|
||
o_pai.dealowner = tmpdeal[idx] + 1;
|
||
}
|
||
//将数组的最后一位至该位置
|
||
if (idx < tmpdeal.length - 1) {
|
||
tmpdeal[idx] = tmpdeal[tmpdeal.length - 1];
|
||
};
|
||
//数组长度减一
|
||
tmpdeal.length = tmpdeal.length - 1;
|
||
}
|
||
|
||
//进入叫分阶段
|
||
var start_call = function(){
|
||
paiju.step = 1;
|
||
var o_call = {};
|
||
o_call.seat = paiju.firstseat;
|
||
o_call.call = null; //null:未叫分 0:不叫分 >0:叫分分数
|
||
paiju.callproc.push(o_call);
|
||
}
|
||
|
||
// ================= 实例的公有属性 ================= //
|
||
paiju.o_desk = o_desk;
|
||
//牌局号
|
||
paiju.idx = o_desk.paiju_list.length;
|
||
//第一个叫分者的位置
|
||
paiju.firstseat = firstseat;
|
||
//开始时间
|
||
paiju.starttime = min_now();
|
||
//结束时间
|
||
paiju.endtime = null;
|
||
//座位列表
|
||
paiju.seatlist = [];
|
||
//牌列表
|
||
paiju.cards = [];
|
||
//当前阶段
|
||
paiju.step = -1; //1发完牌叫分 2选主 3埋牌 4投降 5出牌 6结算
|
||
//叫分过程
|
||
paiju.callproc = [];
|
||
//庄家位置
|
||
paiju.banker = -1;
|
||
//庄家叫分
|
||
paiju.call = -1;
|
||
//主牌花色
|
||
paiju.flower = -1;
|
||
//当前出牌情况
|
||
paiju.playproc = {};
|
||
//输赢结果 0:庄赢 1:闲赢 2:庄投降 3:中途解散
|
||
paiju.result = null;
|
||
//结算包,供断线重连时使用,新开一局时清除
|
||
paiju.tmp_jiesuan_aset = null;
|
||
|
||
//初始化座位列表
|
||
init_seatlist();
|
||
//初始化牌列表并发牌
|
||
init_cards();
|
||
//进入叫分阶段
|
||
start_call();
|
||
|
||
// ================= 实例的公有方法 ================= //
|
||
paiju.method = {};
|
||
|
||
//获取某个位置玩家手上的牌
|
||
paiju.method.get_seat_cards = function(seat){
|
||
return cls_youle_erqiwang_paiju.get_seat_cards(paiju, seat);
|
||
}
|
||
|
||
//获取当前的叫分位置
|
||
paiju.method.get_callgrade_seat = function(){
|
||
return paiju.callproc[paiju.callproc.length - 1].seat;
|
||
}
|
||
|
||
//获取当前的叫分分数
|
||
paiju.method.get_callgrade_value = function(){
|
||
return cls_youle_erqiwang_paiju.get_callgrade_value(paiju);
|
||
}
|
||
|
||
//获取某个玩家的当前叫分情况
|
||
paiju.method.get_seat_callgrade = function(seat){
|
||
return cls_youle_erqiwang_paiju.get_seat_callgrade(paiju, seat);
|
||
}
|
||
|
||
//叫分或不叫
|
||
paiju.method.do_callgrade = function(call){
|
||
cls_youle_erqiwang_paiju.do_callgrade(paiju, call);
|
||
}
|
||
|
||
//获取底牌
|
||
paiju.method.get_bottomcards = function(){
|
||
return cls_youle_erqiwang_paiju.get_bottomcards(paiju);
|
||
}
|
||
|
||
//选主
|
||
paiju.method.do_choiceflower = function(flower){
|
||
cls_youle_erqiwang_paiju.do_choiceflower(paiju, flower);
|
||
}
|
||
|
||
//判断牌是否在玩家手上
|
||
paiju.method.check_cards_inhand = function(cards, seat){
|
||
return cls_youle_erqiwang_paiju.check_cards_inhand(paiju, cards, seat);
|
||
}
|
||
|
||
//埋牌
|
||
paiju.method.do_burycard = function(cards){
|
||
cls_youle_erqiwang_paiju.do_burycard(paiju, cards);
|
||
}
|
||
|
||
//检查选中的牌是否可出,并出牌
|
||
paiju.method.do_playcard = function(cards){
|
||
return cls_youle_erqiwang_paiju.do_playcard(paiju, cards);
|
||
}
|
||
|
||
//是否有人报副
|
||
paiju.method.have_baofu = function(){
|
||
return (paiju.seatlist[0][4][0] == 0 || paiju.seatlist[1][4][0] == 0 || paiju.seatlist[2][4][0] == 0);
|
||
}
|
||
|
||
//在牌列表中获取分牌和分值
|
||
paiju.method.get_grade_incard = function(cards){
|
||
return cls_youle_erqiwang_paiju.get_grade_incard(paiju, cards);
|
||
}
|
||
|
||
//获取埋牌
|
||
paiju.method.get_burycard= function(){
|
||
return cls_youle_erqiwang_paiju.get_burycard(paiju);
|
||
}
|
||
|
||
//获取抠底包
|
||
paiju.method.get_bottom_account = function(msg){
|
||
return cls_youle_erqiwang_paiju.get_bottom_account(paiju, msg);
|
||
}
|
||
|
||
//小局结算,type 0正常结算 1投降结算 2解散结算
|
||
paiju.method.get_paiju_account = function(type, msg){
|
||
return cls_youle_erqiwang_paiju.get_paiju_account(paiju, type, msg);
|
||
}
|
||
|
||
//获取闲家当前的捡分分数和分牌
|
||
paiju.method.get_jian_grade = function(){
|
||
return cls_youle_erqiwang_paiju.get_jian_grade(paiju);
|
||
}
|
||
|
||
return paiju;
|
||
},
|
||
|
||
//下一个位置
|
||
get_nextseat: function(seat){
|
||
return (seat + 1) % 3;
|
||
},
|
||
|
||
//获取某个位置玩家手上的牌
|
||
get_seat_cards: function(o_paiju, seat){
|
||
var aryCardIDs = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
var o_card = o_paiju.cards[i];
|
||
if (o_card.playround == -1){ //未出的牌
|
||
if ((o_card.dealowner == seat + 1) || //发到手上
|
||
(o_card.dealowner == 0 && seat == o_paiju.banker)){ //庄家包括底牌
|
||
aryCardIDs.push(o_paiju.cards[i].id);
|
||
}
|
||
}
|
||
}
|
||
return cls_youle_erqiwang_arith.order_cards(o_paiju.flower, aryCardIDs);
|
||
},
|
||
|
||
//获取某个位置玩家发到手上的牌
|
||
get_seat_cards_deal: function(o_paiju, seat){
|
||
var aryCardIDs = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
var o_card = o_paiju.cards[i];
|
||
if (o_card.dealowner == seat + 1){
|
||
aryCardIDs.push(o_paiju.cards[i].id);
|
||
}
|
||
}
|
||
return cls_youle_erqiwang_arith.order_cards(o_paiju.flower, aryCardIDs);
|
||
},
|
||
|
||
//获取某个位置玩家发到手上的牌(庄家包含底牌)
|
||
get_seat_cards_owner: function(o_paiju, seat){
|
||
var aryCardIDs = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
var o_card = o_paiju.cards[i];
|
||
if ((o_card.dealowner == seat + 1) || //发到手上
|
||
(o_card.dealowner == 0 && seat == o_paiju.banker)){ //庄家包括底牌
|
||
aryCardIDs.push(o_paiju.cards[i].id);
|
||
}
|
||
}
|
||
return cls_youle_erqiwang_arith.order_cards(o_paiju.flower, aryCardIDs);
|
||
},
|
||
|
||
//获取某个位置玩家手上的主牌
|
||
get_seat_zhucards: function(o_paiju, seat){
|
||
var aryCardIDs = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
var o_card = o_paiju.cards[i];
|
||
if (o_card.playround == -1){ //未出的牌
|
||
if ((o_card.dealowner == seat + 1) || //发到手上
|
||
(o_card.dealowner == 0 && seat == o_paiju.banker)){ //庄家包括底牌
|
||
if (o_card.flower == o_paiju.flower || o_card.flower == 5 || o_card.number == 2 || o_card.number == 7){
|
||
aryCardIDs.push(o_paiju.cards[i].id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return cls_youle_erqiwang_arith.order_cards(o_paiju.flower, aryCardIDs);
|
||
},
|
||
|
||
//获取当前的叫分分数
|
||
get_callgrade_value: function(o_paiju){
|
||
var value = 0;
|
||
for (var i = o_paiju.callproc.length - 2; i >= 0; i--) {
|
||
if (o_paiju.callproc[i].call) {
|
||
value = o_paiju.callproc[i].call;
|
||
break;
|
||
}
|
||
}
|
||
return value;
|
||
},
|
||
|
||
//获取某个位置的叫分 返回值:null未叫 0不叫 >0当前叫分
|
||
get_seat_callgrade: function(o_paiju, seat){
|
||
for (var i = o_paiju.callproc.length - 2; i >= 0; i--){
|
||
if (o_paiju.callproc[i].seat == seat){
|
||
return o_paiju.callproc[i].call;
|
||
}
|
||
}
|
||
return null;
|
||
},
|
||
|
||
//叫分
|
||
do_callgrade: function(o_paiju, call){
|
||
var o_call = o_paiju.callproc[o_paiju.callproc.length - 1];
|
||
o_call.call = call;
|
||
|
||
//等待下一个叫分者叫分
|
||
var do_wait_nextseat_call = function(seat){
|
||
var o_call = {};
|
||
o_call.seat = seat;
|
||
o_call.call = null;
|
||
o_paiju.callproc.push(o_call);
|
||
}
|
||
|
||
//上庄
|
||
var do_up_banker = function(seat, call){
|
||
//庄家位置
|
||
o_paiju.banker = seat;
|
||
//庄家叫分
|
||
o_paiju.call = call;
|
||
//进入选主阶段
|
||
o_paiju.step = 2;
|
||
}
|
||
|
||
//叫了5分直接上庄
|
||
if (call == 5){
|
||
do_up_banker(o_call.seat, call);
|
||
return;
|
||
}
|
||
//叫了分
|
||
if (call > 0){
|
||
//下一个位置
|
||
var nextseat = cls_youle_erqiwang_paiju.get_nextseat(o_call.seat);
|
||
//下一个位置的叫分
|
||
var nextcall = cls_youle_erqiwang_paiju.get_seat_callgrade(o_paiju, nextseat);
|
||
//下一个位置不叫分
|
||
if (nextcall == 0){
|
||
//再下一个位置
|
||
nextseat = cls_youle_erqiwang_paiju.get_nextseat(nextseat);
|
||
}
|
||
//等待下一个叫分者叫分
|
||
do_wait_nextseat_call(nextseat);
|
||
return;
|
||
}
|
||
|
||
//不叫
|
||
if (call == 0){
|
||
//下一个位置
|
||
var nextseat_1 = cls_youle_erqiwang_paiju.get_nextseat(o_call.seat);
|
||
//下一个位置的叫分
|
||
var nextcall_1 = cls_youle_erqiwang_paiju.get_seat_callgrade(o_paiju, nextseat_1);
|
||
//再下一个位置
|
||
var nextseat_2 = cls_youle_erqiwang_paiju.get_nextseat(nextseat_1);
|
||
//再下一个位置的叫分
|
||
var nextcall_2 = cls_youle_erqiwang_paiju.get_seat_callgrade(o_paiju, nextseat_2);
|
||
|
||
if (nextcall_1 != 0 && nextcall_2 != 0){
|
||
//另外两家都没有不叫分
|
||
do_wait_nextseat_call(nextseat_1);
|
||
return;
|
||
}
|
||
if (nextcall_1 != 0 && nextcall_2 == 0){
|
||
//nextseat_1上庄
|
||
do_up_banker(nextseat_1, nextcall_1);
|
||
return;
|
||
}
|
||
if (nextcall_1 == 0 && nextcall_2 != 0){
|
||
//nextseat_2上庄
|
||
do_up_banker(nextseat_2, nextcall_2);
|
||
return;
|
||
}
|
||
}
|
||
},
|
||
|
||
//获取底牌
|
||
get_bottomcards: function(o_paiju){
|
||
var aryCardIDs = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
if (o_paiju.cards[i].dealowner == 0){
|
||
aryCardIDs.push(o_paiju.cards[i].id);
|
||
}
|
||
}
|
||
return cls_youle_erqiwang_arith.order_cards(o_paiju.flower, aryCardIDs);
|
||
},
|
||
|
||
//选主
|
||
do_choiceflower: function(o_paiju, flower){
|
||
o_paiju.flower = flower;
|
||
//修改主牌的牌编码
|
||
for (var i = 1; i <= 2; i++){ //两副牌
|
||
for (var j = 0; j < 13; j++){
|
||
var o_card = o_paiju.cards[(i - 1) * 54 + (flower - 1) * 13 + j];
|
||
}
|
||
}
|
||
//进入埋牌阶段
|
||
o_paiju.step = 3;
|
||
},
|
||
|
||
//判断牌是否在玩家手上
|
||
check_cards_inhand: function(o_paiju, cards, seat){
|
||
for (var i = 0; i < cards.length; i++) {
|
||
var o_card = o_paiju.cards[cards[i]];
|
||
if (o_card.playround != -1){
|
||
return;
|
||
}
|
||
if (seat == o_paiju.banker){
|
||
//是庄家
|
||
if (o_card.dealowner != seat + 1 && o_card.dealowner != 0){
|
||
return false;
|
||
}
|
||
} else {
|
||
//是闲家
|
||
if (o_card.dealowner != seat + 1){
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
},
|
||
|
||
//埋牌
|
||
do_burycard: function(o_paiju, cards){
|
||
for (var i = 0; i < cards.length; i++) {
|
||
o_paiju.cards[cards[i]].playround = 0;
|
||
};
|
||
//进入投降阶段
|
||
o_paiju.step = 4;
|
||
cls_youle_erqiwang_paiju.new_playround(o_paiju, 1, o_paiju.banker);
|
||
},
|
||
|
||
//新一轮出牌
|
||
new_playround: function(o_paiju, round, startseat){
|
||
o_paiju.playproc.round = round; //第几轮
|
||
o_paiju.playproc.start = startseat; //本轮的起始出牌位置
|
||
o_paiju.playproc.currseat = startseat; //本轮的当前的出牌位置
|
||
o_paiju.playproc.startcount = -1; //本轮第一个出牌的张数
|
||
o_paiju.playproc.startflower = -1; //本轮第一个出牌的花色
|
||
o_paiju.playproc.starttype = -1; //本轮第一个出牌的牌型
|
||
o_paiju.playproc.maxseat = -1; //谁的牌最大,位置
|
||
o_paiju.playproc.maxcard = -1; //满足第一个玩家出牌的牌型最大牌
|
||
o_paiju.playproc.cards = []; //本轮各位置出的牌,数组与位置序号对应
|
||
o_paiju.playproc.cards.length= 3;
|
||
},
|
||
|
||
//在牌列表中获取分牌和分值
|
||
get_grade_incard: function(o_paiju, cards){
|
||
var re = {};
|
||
re.grade = 0;
|
||
re.cards = [];
|
||
for (var i = 0; i < cards.length; i++) {
|
||
if (o_paiju.cards[cards[i]].score > 0){
|
||
re.grade = re.grade + o_paiju.cards[cards[i]].score;
|
||
re.cards.push(cards[i]);
|
||
}
|
||
}
|
||
return re;
|
||
},
|
||
|
||
//检查选中的牌是否可出,并出牌
|
||
do_playcard: function(o_paiju, cards){
|
||
//出牌
|
||
var doplay = function(playindex){
|
||
for (var i = 0; i < cards.length; i++) {
|
||
o_paiju.cards[cards[i]].playround = o_paiju.playproc.round;
|
||
o_paiju.cards[cards[i]].playindex = playindex;
|
||
};
|
||
o_paiju.playproc.cards[o_paiju.playproc.currseat] = cards;
|
||
|
||
//进入出牌阶段
|
||
o_paiju.step = 5;
|
||
|
||
//是否报副处理
|
||
if (o_paiju.seatlist[o_paiju.playproc.currseat][4][0] != 0){
|
||
var _zhu = cls_youle_erqiwang_paiju.get_seat_zhucards(o_paiju, o_paiju.playproc.currseat);
|
||
if (_zhu.length == 0){
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][4][0] = 0;
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][4][1] = 0;
|
||
}
|
||
if (o_paiju.method.have_baofu()){
|
||
var _parilist = cls_youle_erqiwang_arith.get_pairlist(o_paiju.flower, _zhu);
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][4][0] = _zhu.length;
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][4][1] = _parilist.length;
|
||
|
||
if (o_paiju.seatlist[o_paiju.playproc.currseat][4][0] == 0){
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][o_paiju.flower - 1][0] = 1;
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][o_paiju.flower - 1][1] = 1;
|
||
} else if (o_paiju.seatlist[o_paiju.playproc.currseat][4][1] == 0){
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][o_paiju.flower - 1][1] = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//本轮中的第二个出牌位置
|
||
var nextseat_1 = cls_youle_erqiwang_paiju.get_nextseat(o_paiju.playproc.start);
|
||
//本轮中的第三个出牌位置
|
||
var nextseat_2 = cls_youle_erqiwang_paiju.get_nextseat(nextseat_1);
|
||
|
||
if (o_paiju.playproc.currseat == o_paiju.playproc.start){ //是本轮的第一个出牌
|
||
var can = cls_youle_erqiwang_arith.can_playcard(o_paiju.flower, cards, o_paiju.playproc.currseat, o_paiju.seatlist);
|
||
if (!can.result){
|
||
var re = {};
|
||
re.result = false;
|
||
return re;
|
||
}
|
||
//出牌
|
||
doplay(1);
|
||
//记录下牌型、花色、牌型最大牌
|
||
o_paiju.playproc.startcount = cards.length;
|
||
o_paiju.playproc.startflower = can.flower;
|
||
o_paiju.playproc.starttype = can.cardtype;
|
||
o_paiju.playproc.maxseat = o_paiju.playproc.currseat;
|
||
o_paiju.playproc.maxcard = can.cardvalue;
|
||
o_paiju.playproc.currseat = nextseat_1;
|
||
//返回结果
|
||
var re1 = {};
|
||
re1.result = true;
|
||
re1.idx = 1;
|
||
re1.count = cards.length;
|
||
re1.flower = can.flower;
|
||
re1.cardtype = can.cardtype;
|
||
return re1;
|
||
}
|
||
|
||
//不是本轮中的第一个出牌,是跟牌
|
||
var cardsinhand = cls_youle_erqiwang_paiju.get_seat_cards(o_paiju, o_paiju.playproc.currseat);
|
||
var can = cls_youle_erqiwang_arith.can_followcard(o_paiju.flower, cardsinhand, cards, o_paiju.playproc.startcount, o_paiju.playproc.startflower, o_paiju.playproc.starttype);
|
||
if (!can.result){
|
||
var re = {};
|
||
re.result = false;
|
||
return re;
|
||
}
|
||
|
||
//与之前的出牌比较大小
|
||
if (can.cardvalue > o_paiju.playproc.maxcard){
|
||
o_paiju.playproc.maxseat = o_paiju.playproc.currseat;
|
||
o_paiju.playproc.maxcard = can.cardvalue;
|
||
}
|
||
|
||
//无花色、无对子处理
|
||
if (can.nopair){
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][o_paiju.playproc.startflower - 1][1] = 1;
|
||
}
|
||
if (can.noflower){
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][o_paiju.playproc.startflower - 1][0] = 1;
|
||
o_paiju.seatlist[o_paiju.playproc.currseat][o_paiju.playproc.startflower - 1][1] = 1;
|
||
}
|
||
|
||
//是本轮中的第二个出牌
|
||
if (o_paiju.playproc.currseat == nextseat_1){
|
||
//出牌
|
||
doplay(2);
|
||
//下一个出牌者
|
||
o_paiju.playproc.currseat = nextseat_2;
|
||
//返回结果
|
||
var re2 = {};
|
||
re2.idx = 2;
|
||
re2.result = true;
|
||
return re2;
|
||
}
|
||
|
||
//是本轮中的第三个出牌
|
||
//出牌
|
||
doplay(3);
|
||
//本轮出牌结束
|
||
for (var i = 0; i < o_paiju.playproc.cards.length; i++) {
|
||
for (var j = 0; j < o_paiju.playproc.cards[i].length; j++) {
|
||
o_paiju.cards[o_paiju.playproc.cards[i][j]].playowner = o_paiju.playproc.maxseat;
|
||
}
|
||
}
|
||
|
||
//返回结果
|
||
var re3 = {};
|
||
re3.result = true;
|
||
re3.idx = 3;
|
||
re3.maxseat = o_paiju.playproc.maxseat;
|
||
if (o_paiju.playproc.maxseat != o_paiju.banker){
|
||
re3.grade = 0;
|
||
// re3.gradecards = [];
|
||
for (var i = 0; i < o_paiju.playproc.cards.length; i++) {
|
||
var grade_incards = cls_youle_erqiwang_paiju.get_grade_incard(o_paiju, o_paiju.playproc.cards[i]);
|
||
re3.grade = re3.grade + grade_incards.grade;
|
||
// re3.gradecards = re3.gradecards.concat(grade_incards.cards);
|
||
}
|
||
}
|
||
|
||
//判断是否还有牌在玩家手上未出
|
||
var havecard_inhand = function(){
|
||
for (var i = 0; i < o_paiju.cards.length; i++) {
|
||
if (o_paiju.cards[i].playround == -1 && o_paiju.cards[i].number != 3 && o_paiju.cards[i].number != 4){
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
// if (!havecard_inhand() || o_paiju.playproc.round == 2){ //测试用
|
||
if (!havecard_inhand()){
|
||
//进入结算阶段
|
||
o_paiju.step = 6;
|
||
} else {
|
||
//新一轮出牌
|
||
cls_youle_erqiwang_paiju.new_playround(o_paiju, o_paiju.playproc.round + 1, o_paiju.playproc.maxseat);
|
||
}
|
||
return re3;
|
||
},
|
||
|
||
//获取埋牌
|
||
get_burycard: function(o_paiju){
|
||
var aryCardIDs = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
if (o_paiju.cards[i].playround == 0){
|
||
aryCardIDs.push(o_paiju.cards[i].id);
|
||
}
|
||
}
|
||
return cls_youle_erqiwang_arith.order_cards(o_paiju.flower, aryCardIDs);
|
||
},
|
||
|
||
//获取抠底包
|
||
get_bottom_account: function(o_paiju, msg){
|
||
msg.data.bottom = {};
|
||
msg.data.bottom.cards = o_paiju.method.get_burycard();
|
||
if (o_paiju.playproc.maxseat != o_paiju.banker){ //闲家抠底
|
||
var multiple = cls_youle_erqiwang_arith.get_bottom_multiple(o_paiju.flower, o_paiju.playproc.cards[o_paiju.playproc.maxseat]);
|
||
if (multiple > 0){
|
||
msg.data.bottom.multiple = multiple;
|
||
var get = o_paiju.method.get_grade_incard(msg.data.bottom.cards);
|
||
msg.data.bottom.grade1 = get.grade;
|
||
msg.data.bottom.grade2 = multiple * msg.data.bottom.grade1;
|
||
}
|
||
}
|
||
return msg;
|
||
},
|
||
|
||
//获取闲家捡分(不包含抠底)
|
||
get_jian_grade: function(o_paiju){
|
||
var re = {};
|
||
re.grade = 0;
|
||
re.cards = [];
|
||
for (var i = 0; i < o_paiju.cards.length; i++){
|
||
if (o_paiju.cards[i].playowner > -1 && o_paiju.cards[i].playowner != o_paiju.banker){
|
||
if (o_paiju.cards[i].score > 0){
|
||
re.grade = re.grade + o_paiju.cards[i].score;
|
||
re.cards.push(i);
|
||
}
|
||
}
|
||
}
|
||
return re;
|
||
},
|
||
|
||
//获取小局结算包,type 0正常结算 1投降结算 2解散结算
|
||
get_paiju_account: function(o_paiju, type, msg){
|
||
o_paiju.endtime = min_now();
|
||
//第一局结算扣除房卡
|
||
if (o_paiju.idx == 1 && type != 2){
|
||
var do_deduct_roomcard = function(){
|
||
youle_erqiwang.import.deduct_roomcard(o_paiju.o_desk.o_room);
|
||
}
|
||
min_ontimeout(do_deduct_roomcard, 1000);
|
||
}
|
||
|
||
if (msg.rpc != "jiesuan"){
|
||
msg.rpc = "jiesuan";
|
||
}
|
||
if (!msg.data){
|
||
msg.data = {};
|
||
}
|
||
msg.data.aset = {};
|
||
msg.data.aset.banker = o_paiju.banker;
|
||
msg.data.aset.call = o_paiju.call;
|
||
msg.data.aset.multiple = cls_youle_erqiwang_arith.get_multiple_bycall(o_paiju.call);
|
||
msg.data.aset.flower = o_paiju.flower;
|
||
var jian_grade = cls_youle_erqiwang_paiju.get_jian_grade(o_paiju);
|
||
msg.data.aset.grade = jian_grade.grade;
|
||
if (msg.data.bottom && msg.data.bottom.grade2){
|
||
msg.data.aset.grade = msg.data.aset.grade + msg.data.bottom.grade2;
|
||
}
|
||
switch (type){
|
||
case 0:
|
||
msg.data.aset.upgrade = cls_youle_erqiwang_arith.get_upgrade(o_paiju.call, msg.data.aset.grade);
|
||
if (msg.data.aset.upgrade > 0){
|
||
o_paiju.result = 0;
|
||
} else {
|
||
o_paiju.result = 1;
|
||
}
|
||
break;
|
||
case 1:
|
||
msg.data.aset.upgrade = -99;
|
||
o_paiju.result = 2;
|
||
break;
|
||
case 2:
|
||
msg.data.aset.upgrade = 0;
|
||
o_paiju.result = 3;
|
||
break;
|
||
}
|
||
|
||
msg.data.aset.seatlist = [];
|
||
var _player0 = {};
|
||
var _player1 = {};
|
||
var _player2 = {};
|
||
//获取玩家的牌
|
||
var _card0 = cls_youle_erqiwang_paiju.get_seat_cards_owner(o_paiju, 0);
|
||
var _card1 = cls_youle_erqiwang_paiju.get_seat_cards_owner(o_paiju, 1);
|
||
var _card2 = cls_youle_erqiwang_paiju.get_seat_cards_owner(o_paiju, 2);
|
||
//计算冲关或王牌
|
||
var _flower = o_paiju.flower;
|
||
if (type != 2){
|
||
_flower = -1;
|
||
}
|
||
var _chongguan0 = cls_youle_erqiwang_arith.get_chongguan(_flower, _card0);
|
||
var _chongguan1 = cls_youle_erqiwang_arith.get_chongguan(_flower, _card1);
|
||
var _chongguan2 = cls_youle_erqiwang_arith.get_chongguan(_flower, _card2);
|
||
//冲关的牌或王牌
|
||
_player0.cards = _chongguan0.cards;
|
||
_player1.cards = _chongguan1.cards;
|
||
_player2.cards = _chongguan2.cards;
|
||
//关数
|
||
_player0.chongguan = _chongguan0.count;
|
||
_player1.chongguan = _chongguan1.count;
|
||
_player2.chongguan = _chongguan2.count;
|
||
//是否作废
|
||
_player0.obsolete = 0;
|
||
_player1.obsolete = 0;
|
||
_player2.obsolete = 0;
|
||
//根据叫分判断冲关是否作废
|
||
var do_obsolete_with_call = function(player, seat){
|
||
var _dealcards = cls_youle_erqiwang_paiju.get_seat_cards_deal(o_paiju, seat);
|
||
var _dealchongguan = cls_youle_erqiwang_arith.get_chongguan(-1, _dealcards);
|
||
if (_dealchongguan.count == 0){
|
||
return;
|
||
}
|
||
var _call = null;
|
||
for (var i = 0; i < o_paiju.callproc.length; i++){
|
||
if (o_paiju.callproc[i].seat == seat){
|
||
_call = o_paiju.callproc[i].call;
|
||
break;
|
||
}
|
||
}
|
||
if (!_call){ //冲关必叫
|
||
player.obsolete = 1;
|
||
} else if (_dealchongguan.wang == 4 && _call > 60){ //四王必踢
|
||
player.obsolete = 1;
|
||
}
|
||
}
|
||
|
||
do_obsolete_with_call(_player0, 0);
|
||
do_obsolete_with_call(_player1, 1);
|
||
do_obsolete_with_call(_player2, 2);
|
||
//计算冲关得分
|
||
var _cg0 = _player0.chongguan;
|
||
var _cg1 = _player1.chongguan;
|
||
var _cg2 = _player2.chongguan;
|
||
if (_player0.obsolete){
|
||
_cg0 = 0;
|
||
}
|
||
if (_player1.obsolete){
|
||
_cg1 = 0;
|
||
}
|
||
if (_player2.obsolete){
|
||
_cg2 = 0;
|
||
}
|
||
_player0.grade_cg = _cg0 * 2 - _cg1 - _cg2;
|
||
_player1.grade_cg = _cg1 * 2 - _cg2 - _cg0;
|
||
_player2.grade_cg = _cg2 * 2 - _cg0 - _cg1;
|
||
//计算傍王得分
|
||
var _w0 = _chongguan0.wang;
|
||
var _w1 = _chongguan1.wang;
|
||
var _w2 = _chongguan2.wang;
|
||
if (_player0.obsolete){
|
||
_w0 = 0;
|
||
}
|
||
if (_player1.obsolete){
|
||
_w1 = 0;
|
||
}
|
||
if (_player2.obsolete){
|
||
_w2 = 0;
|
||
}
|
||
_player0.grade_w = _w0 * 2 - _w1 - _w2;
|
||
_player1.grade_w = _w1 * 2 - _w2 - _w0;
|
||
_player2.grade_w = _w2 * 2 - _w0 - _w1;
|
||
//计算捡分得分
|
||
var _upgrade = msg.data.aset.upgrade;
|
||
if (_upgrade == -99){
|
||
_upgrade = -2;
|
||
}
|
||
switch (o_paiju.banker){
|
||
case -1:
|
||
_player0.grade_jf = 0;
|
||
_player1.grade_jf = 0;
|
||
_player2.grade_jf = 0;
|
||
break;
|
||
case 0:
|
||
_player0.grade_jf = _upgrade * msg.data.aset.multiple * 2;
|
||
_player1.grade_jf = _upgrade * msg.data.aset.multiple * -1;
|
||
_player2.grade_jf = _player1.grade_jf;
|
||
break;
|
||
case 1:
|
||
_player0.grade_jf = _upgrade * msg.data.aset.multiple * -1;
|
||
_player1.grade_jf = _upgrade * msg.data.aset.multiple * 2;
|
||
_player2.grade_jf = _player0.grade_jf;
|
||
break;
|
||
case 2:
|
||
_player0.grade_jf = _upgrade * msg.data.aset.multiple * -1;
|
||
_player1.grade_jf = _player0.grade_jf;
|
||
_player2.grade_jf = _upgrade * msg.data.aset.multiple * 2;
|
||
break;
|
||
}
|
||
//计算本局总得分
|
||
_player0.grade = _player0.grade_cg + _player0.grade_w + _player0.grade_jf;
|
||
_player1.grade = _player1.grade_cg + _player1.grade_w + _player1.grade_jf;
|
||
_player2.grade = _player2.grade_cg + _player2.grade_w + _player2.grade_jf;
|
||
//大局累积得分
|
||
o_paiju.o_desk.seatlist[0][0] = o_paiju.o_desk.seatlist[0][0] + _player0.grade;
|
||
o_paiju.o_desk.seatlist[1][0] = o_paiju.o_desk.seatlist[1][0] + _player1.grade;
|
||
o_paiju.o_desk.seatlist[2][0] = o_paiju.o_desk.seatlist[2][0] + _player2.grade;
|
||
_player0.score = o_paiju.o_desk.seatlist[0][0];
|
||
_player1.score = o_paiju.o_desk.seatlist[1][0];
|
||
_player2.score = o_paiju.o_desk.seatlist[2][0];
|
||
//保存每局得分
|
||
o_paiju.o_desk.seatlist[0][1].push(_player0.grade);
|
||
o_paiju.o_desk.seatlist[1][1].push(_player1.grade);
|
||
o_paiju.o_desk.seatlist[2][1].push(_player2.grade);
|
||
|
||
msg.data.aset.seatlist.push(_player0);
|
||
msg.data.aset.seatlist.push(_player1);
|
||
msg.data.aset.seatlist.push(_player2);
|
||
|
||
if (o_paiju.idx >= o_paiju.o_desk.o_room.asetcount || type == 2){
|
||
msg = o_paiju.o_desk.method.get_desk_account(msg);
|
||
}
|
||
|
||
//保存结算包,供断线重连时使用
|
||
o_paiju.tmp_jiesuan_aset = msg.data.aset;
|
||
|
||
return msg;
|
||
}
|
||
}
|