目录结构调整

This commit is contained in:
2026-02-04 23:47:45 +08:00
parent 6938c911c3
commit 6b22238c6e
8780 changed files with 15333 additions and 574 deletions

View File

@@ -0,0 +1,497 @@
/*****************黄欢****************/
/**
* ————————
*游戏自定义接口
* ————————
* */
var RoomConfig = {
roomcode: 100000,
roomtype: [],
room_name_type: {},
turns: 0,
people: 2,
}
/*房间号,局数,游戏玩法,人数*/
function RoomInit(roomtype) {
RoomConfig.roomcode = Desk.roomcode || 100000;
if (Desk.roomtype && Desk.roomtype.length > 0) {
RoomConfig.roomtype = Desk.roomtype;
} else if (roomtype && roomtype.length > 0) {
RoomConfig.roomtype = roomtype;
} else {
RoomConfig.roomtype = [];
}
(function (roomtype) {
RoomConfig.turns = roomtype[1] * 8 || 0;
var peoples = [4, 4, 3, 2]
RoomConfig.people = (peoples[roomtype[6]]) || 4;
RoomConfig.room_name_type.jushu = roomtype[1];//局数
RoomConfig.room_name_type.buy_horse = roomtype[2];//买马
RoomConfig.room_name_type.limit = roomtype[3];//精分
RoomConfig.room_name_type.horse = roomtype[5];//几匹马
RoomConfig.room_name_type.top_limit = roomtype[6];//封顶 人数
RoomConfig.room_name_type.host2 = roomtype[7];//庄家翻倍
RoomConfig.room_name_type.base_score = roomtype[8];//底分
RoomConfig.room_name_type.piao = roomtype[9];//底分
RoomConfig.room_name_type.jia = roomtype[10];//底分
RoomConfig.room_name_type.start_hu = roomtype[11];//底分
RoomConfig.room_name_type.start_hu_arr = roomtype[12];//底分
RoomConfig.room_name_type.star = roomtype[13];//底分
RoomConfig.room_name_type.qiangganghu = roomtype[15];//底分
})(RoomConfig.roomtype);
}
//房间接口
var RoomFunc = {};
//房间变量池
var RoomPool = {};
//可能会执行很多次
//点击,永远可用
RoomFunc.c_click = function (spid_up, upx, upy, downx, downy, spid_down) {
if (spid_up == 1403) {
d.click_ready(1403);
set_group(208,37,0,0,0);
set_group(300,37,0,0,0);
}
if (spid_up == 2998) {
d.show_xiao_settle(1);
d.show_timeready(1);
}
if (spid_up != 2999 && get_self(1247, 37)) {//听牌显示
set_group(237, 37, 0, 0, 0);
}
if (spid_up == 2233) {//托管
RoomFunc.tuoguan();
}
if (spid_up == 2996 && d.huanpai2.length == 3) {//换三张
d.huanpai3(1);
}
if (spid_up == 2994) {//取消换三张
d.huanpai3(2);
}
if (d.replay == 0 && (spid_up == 2231 || spid_up == 2232)) {//取消托管
d.OverTime = 0;
d.jishi_chu = 0;
set_group(221, 37, 0, 0, 0);
set_self(2233, 43, 1, 0, 0);
if(d.user_ctrl[2] == C_Player.seat && d.replay==0) {
set_self (2895,37,1,0,0);
set_self (2896,37,1,0,0);
set_self (2897,37,1,0,0);
}
d.show_my13card();
d.show_14card();
}
if (spid_up == 2509) {//小局2
d.horse_time = 0;
d.compare_jing_time3 = 0;
if (get_self(1598, 37) == 1) {
d.a.show_history3_1();
} else {
d.show_xiao1_settle(1);
}
}
if (spid_up == 2510) {//小局2
set_group(260, 37, 0, 0, 0);
}
if (spid_up == 2656) {//精牌详情
d.horse_time = 0;
d.compare_jing_time3 = 0;
set_self(2656, 37, 0);
d.show_xiao2_settle(1);
set_group(214, 41, 0, 0, 0);
set_self(2657, 41, 1);
set_self(2787, 41, 1);
//if (get_self(1598,37) == 1) {
//d.a.show_history3_2();
//}else {
//d.show_xiao2_settle(1);
//}
}
if (spid_up == 2787 || spid_up == 2657) {//关闭精牌详情
set_self(2656, 37, 1);
set_group(214, 37, 0, 0, 0);
}
if (spid_up == 233) {//结算
d.compare_jing_time3 = 0;
}
if (spid_up == 700) {//关闭胡杠详情
var persons = [4, 4, 3, 2];
var person = persons[Desk.roomtype[6]] || 4;
for (var i = 0; i < person; i++) {
set_self(717 + i, 37, 1);
}
set_group(214, 37, 0, 0, 0);
}
if (spid_up == 2895 && d.replay==0) {
d.click_btn(0);
}
if (spid_up == 2896 && d.replay==0) {
// d.click_btn(1);
RoomFunc.click_tip();
}
if (spid_up == 2897 && d.replay==0) {
d.click_btn(2);
}
//console.log("roomfunc 点击,永远可用");
}
RoomFunc.click_tip = function(){
if(d.getEnumCard.flag){
// var tip = d.getEnumCard.value[d.getEnumCard.getIndex()];
var tip = d.getTip();
if (tip.length>0) {
for (var i = 0; i < 60; i++) {
if (get_self(817 + i, 19, 0, 0, 0) < 500) {
set_self(817 + i, 19, 500, 0, 0);
}
}
for (var i = 0; i < tip.length; i++) {
var index = d.hand[C_Player.seat][0].indexOf(tip[i]);
set_self(817 + index, 19, 480, 0, 0);
}
d.pai = d.c(tip);
d.show_btn();
}else{
d.click_btn(1);
}
}
}
//点击,游戏开始之后可用
RoomFunc.g_click = function (spid_up, upx, upy, downx, downy, spid_down) {
//console.log("roomfunc 点击,游戏开始之后可用");
}
//开战,是否发牌
RoomFunc.make_war = function (_msg) {
console.log("roomfunc RoomConfig一进去就开战");
return true;
}
//重连重绘之前,游戏开始后收到包就执行
RoomFunc.running_before = function (_msg) {
console.log("roomfunc RoomConfig重连重绘之前游戏开始后收到包就执行");
}
//重连重绘
RoomFunc.re_connect = function () {
console.log("roomfunc RoomConfig重连重绘")
}
//重连重绘之后,游戏开始后收到包就执行
RoomFunc.running_after = function (_msg) {
console.log("roomfunc RoomConfig重连重绘之后游戏开始后收到包就执行")
}
//点击牌的判断
RoomFunc.clickpai_before = function (spid, a) {
if (d.replay != 0) {
return false;
}
if (d.isEnd()) {
return false;
}
if (get_self(spid, 21) < 120) {
return false;
}
//if (d.ting_record[C_Player.seat] == 0) {
//return true;
//} else if (d.ting_record[C_Player.seat] == 1) {
//var pos = d.Ting_Tip.indexOf(get_self(spid, 43));
//if (pos != -1) {
//return true;
//}
//} else if (d.ting_record[C_Player.seat] == 3) {
//if (d.user_ctrl[3] == get_self(spid, 43) && spid >= 817 + d.hand[C_Player.seat][0].length) {
//return true;
//}
//}
return false;
}
//点击操作按钮,显示出操作图案之后
RoomFunc.operate_before = function (spid, num) {//num=7是自摸8是放炮 9?10?
if (num == 8) {
//return;
}
if (num == 20) {
num = 12;
}
if (!AM.is_play(spid)) {
AM.remove(spid, false)
var dh_bz = [0, 0, 634, 633, 630, 633, 633, 631, 631, 631, 632, 9, 632];//1吃,3杠,5胡,7碰,9听,
//var a=1;
AM.add(spid).bfunc(function () {
set_self(spid, 1, dh_bz[num], 0, 0);
set_self(spid, 37, 1, 0, 0);
set_self(spid, 33, 200, 0, 0);
set_self(spid, 43, 1, 0, 0);
}).zoom(300, 8).zoom(150, 3).wait(5, function () {
//set_self(spid,37,0,0,0);
//AM.cls_id(spid);
}).start();
}
var dh_bz2 = [0, 0, 634, 633, 630, 633, 633, 631, 631, 631, 632, 9, 632];//1吃,3杠,5胡,7碰,9听,
if (!AM.is_play(spid + 61)) {
AM.add(spid + 61).wait(3, function () {
set_self(spid + 61, 1, dh_bz2[num], 0, 0);
set_self(spid + 61, 18, get_self(spid, 18) - 90, 0, 0);
set_self(spid + 61, 19, get_self(spid, 19) - 90, 0, 0);
set_self(spid + 61, 37, 1, 0, 0);
set_self(spid + 61, 43, 2, 0, 0);
set_self(spid + 61, 35, 255, 0, 0);
set_self(spid + 61, 33, 0, 0, 0);
}).alpha(200, 8).zoom(200, 8).wait(10, function () {
//set_self(spid+61,43,4,0,0);
set_self(spid + 61, 37, 0, 0, 0);
set_self(spid, 37, 0, 0, 0);
AM.cls_id(spid);
AM.cls_id(spid + 61);
}).start();
}
if ((d.last_operate[0] == 2 || d.last_operate[0] == 4) && !d.isEnd()) {
//加杠动画 明杠动画
if (!AM.is_play(2394)) {
AM.add(2394).bfunc(function () {
set_self(2394, 37, 1, 0, 0);
set_self(2394, 43, 2, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 3, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 4, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 5, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 6, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 2, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 3, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 4, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 5, 0, 0);
}).wait(3, function () {
set_self(2394, 43, 6, 0, 0);
}).wait(3, function () {
}).func(function () {
set_self(2394, 37, 0, 0, 0);
set_self(2394, 43, 2, 0, 0);
AM.cls_id(2394);
}).start();
}
}
}
//点击操作按钮
RoomFunc.operate_click = function (spid_up) {
if (get_self(1965, 37) == 1) {
return false;
}
else {
return true;
}
}
//战局开始,牌显示之前
RoomFunc.showcard_before = function () {
set_self(2874, 43, 60, 0, 0);
//一般执行14次
return true;
}
//战局开始,牌显示之后
RoomFunc.showcard_after = function () {
//执行一次
console.log("roomfunc RoomConfig战局开始牌显示之后");
if (RoomFunc.hua()) {
d.hualen3 = [d.hua_hua[0].length, d.hua_hua[1].length, d.hua_hua[2].length, d.hua_hua[3].length];
d.hualen = d.hua_hua[0].length + d.hua_hua[1].length + d.hua_hua[2].length + d.hua_hua[3].length;
if (d.hualen > 0) {
set_self(346, 57, 1000, 0, 0);
}
}
d.playerid = [];
var persons = [4, 4, 3, 2];
var person = persons[Desk.roomtype[6]] || 4;
for (var i = 0; i < person; i++) {
d.playerid.push(Desk.PlayerList[i].playerid);
//d.grade_j.push[d.grade[i]];
}
}
//自己有摸牌,且是自己的控制權
RoomFunc.mopai_before = function (first_card, seat) {
//最新的牌
console.log("roomfunc RoomConfig自己有摸牌且是自己的控制權", first_card, seat);
}
//自己沒摸牌,且是自己的控制權
RoomFunc.nomopai_before = function (seat) {
console.log("roomfunc RoomConfig自己沒摸牌", seat);
}
//要不要顯示战绩,服务器判断要不要买马动画
RoomFunc.zhanji_before = function () {
console.log("roomfunc RoomConfig要不要顯示战绩");
if (RoomFunc.compare_jing() && d.compare_jing_time3 == 0) {
if (get_self(2377, 37) == 0) {
set_self(2377, 37, 1);
}
d.compare_jing_time3 = 1;
} else if (RoomFunc.buyhorse() && d.horse_time == 0) {
d.horse_time = 1;
} else {
return true;
}
return false;
}
//一小局的结束,显示了牌之后,还没有显示动画
RoomFunc.turn_over = function () {
for (var i = 936; i <= 954; i++) {
set_self(i, 1, 503, 0, 0);
}
}
//游戲中战绩显示,在其他数据全部显示之后
RoomFunc.game_show_settle = function (turn, identity, names, avatar, playerids, hand, turn_point, buyHorse, winHorse, Horse_vic_def, final_hu, settlePoint, hu_note_gang, roomtype, many_hu, start_hu, piao, sea_hua, peng_chi_num, hu_note_gang_jing, putJing, jing, jing_reduce) {
}
//大厅战绩显示,在其他数据全部显示之后,与上面的
RoomFunc.game_out_show_settle = function (js, js1) {
}
//绘制接口
RoomFunc.draw = function (spid) {
}
//超时自动出牌
RoomFunc.Overtime_chupai = function () {
var Overtime_chupai = Desk.roomtype[18];
if (Overtime_chupai == 2) {//快版
return true;
}
return false;
}
//托管
RoomFunc.tuoguan = function (mode) {
mode = mode || 0;
if (get_self(2233, 43) == 1 && mode == 0) {
set_self(2233, 43, 2, 0, 0)
d.show_tuoguan();
} else if (mode == 0 || mode == 1) {
set_self(2233, 43, 1, 0, 0)
d.OverTime = 0;
set_group(221, 37, 0, 0, 0);
if(d.user_ctrl[2] == C_Player.seat) {
//set_self (2895,37,1,0,0);
set_self (2896,37,1,0,0);
set_self (2897,37,1,0,0);
}
d.jishi_chu = 0;
}
}
//财神
RoomFunc.god = function () {
return false;
}
//财神
RoomFunc.mammon = function () {
var mammon = Desk.roomtype[11];
if (mammon == 1) {
return true;
} else {
return false;
}
}
//精分
RoomFunc.jingscore = function () {
return false;
}
//比精
RoomFunc.compare_jing = function () {
return false;
}
//买马
RoomFunc.buyhorse = function () {
return false;
}
//可以多人胡
RoomFunc.canManyHu = function () {
return true;
}
//花牌算分
RoomFunc.huascore = function () {
return false;
}
//花牌配置
RoomFunc.hua = function () {
return false;
}
//有抄庄
RoomFunc.can_chao_host = function () {
return false;
}
//血战玩法
RoomFunc.xue_zhan = function () {
return true;
}
//不同张牌数玩法
RoomFunc.num_pai = function () {
if (false) {
return 7;
} else if (true) {
return 10;
} else if (false) {
return 13;
}
return 13;
}

View File

@@ -0,0 +1,785 @@
RoomFunc.card_help = (function () {
var weight = {
'1': 14,
'2': 15,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9,
'10': 10,
'11': 11,
'12': 12,
'13': 13,
'16': 16,
'17': 17
}
var PaiConfig = {
'danshunNum': 5,
'duishunNum': 2,
'sandaiOrNot': 0,
'last4': 0
};
//数组去重
Array.unique = function (array) {
var obj = {};
var back = [];
array.forEach(item => {
!obj[item] && (obj[item] = 1, back.push(item));
})
return back;
}
//对象拷贝
Object.copyObject = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
return function (handCards, putCards, pdkConfig) {
if (typeof (pdkConfig) != 'undefined') {
PaiConfig = pdkConfig;
}
var handArray = convertCard(handCards);
var putArray = convertCard(putCards);
var putType = getType(putArray);
try {
var hasSameType = enumCards(handArray, putArray, putType);
} catch (e) {
var hasSameType = [];
}
return convertBack(hasSameType, handArray);
}
function convertBack(array, handArray) {
if (!Array.isArray(array) || array.length == 0) return [];
var len = array.length;
var result = [];
var temp;
for (var i = 0; i < len; i++) {
temp = realConvert(array[i], handArray);
result.push(temp);
}
return result;
function realConvert(inArray, handArray) {
var len = inArray.length;
var handLen = handArray.length;
var result = [];
var outer = 0;
var inter = 0;
while (outer < len) {
while (inter < handLen) {
var item = handArray[inter];
if (item.weight == inArray[outer] && inArray.indexOf(item.orgin == -1)) {
result.push(item.orgin);
outer++;
if (result.length == len) return result;
}
inter++;
}
}
}
}
function getZha(countAll) {
var temp = [];
for (var item in countAll) {
if (countAll[item] == 4) {
var value = parseInt(item);
temp.push([value, value, value, value]);
}
}
return temp;
}
function enumCards(orignArray, targetArray, putType) {
function filterResult(parm) {
if (result.length != 0) {
var len = result.length;
var temp = [];
for (var i = 0; i < len; i++) {
if (countBaseAll[result[i][0]] == parm) {
temp.push(result[i]);
}
}
if (temp.length > 0) {
result = temp;
}
}
}
var countBaseAll = countAll(orignArray);
var zhaAcount = getZha(countBaseAll);
var result = [];
switch (putType.type) {
case 'dan':
for (var item in countBaseAll) {
var temp = parseInt(item)
temp > putType.value && result.push([temp]);
}
filterResult(1);
break;
case 'dui':
for (var item in countBaseAll) {
var num = countBaseAll[item];
var temp = parseInt(item)
if ((num > 1) && temp > putType.value) {
result.push([temp, temp]);
}
}
filterResult(2);
break;
case "liandui":
for (var item in countBaseAll) {
var temp = parseInt(item);
if (temp == 15) break;
if (temp > putType.value[0]) {
var build = buildArray(temp, putType.count);
if (hasPair(build, countBaseAll, 2)) {
result.push(doubleArray(build));
}
}
}
break;
case "shun":
var hasValue = [];
var baseLen = putType.value.length;
var start = putType.value[0];
for (var item in countBaseAll) {
var value = parseInt(item);
value < 15 && hasValue.push(parseInt(item));
}
hasValue.sort((a, b) => {
return a - b
});
var len = hasValue.length - baseLen;
for (var i = 0; i <= len; i++) {
var tempArr = hasValue.slice(i);
if (tempArr[0] > start && shun(tempArr, baseLen)) {
result.push(createShun(tempArr[0], baseLen));
}
}
break;
case "zha":
for (var item in countBaseAll) {
var temp = parseInt(item);
if (temp > putType.value && countBaseAll[item] == 4) {
result.push([temp, temp, temp, temp]);
}
}
break;
case "sanDai":
for (var item in countBaseAll) {
var temp = parseInt(item);
if (temp > putType.value[0] && countBaseAll[item] == 3) {
var wasteCard = PaiConfig.sandaiOrNot ? getWasteCard(Object.copyObject(countBaseAll), [temp]) : [];
result.push([temp, temp, temp].concat(wasteCard).sort((a, b) => {
return a - b
}));
}
}
break;
case "plane":
for (var item in countBaseAll) {
var temp = parseInt(item);
if (temp > putType.value[0] && countBaseAll[item] >= 3) {
var build = buildArray(temp, putType.count);
if (hasPair(build, countBaseAll, 3)) {
var temp = [];
var wasteCard = PaiConfig.sandaiOrNot ? getWasteCard(Object.copyObject(countBaseAll), build) : [];
build.forEach(item => {
temp = temp.concat([item, item, item]);
})
temp = temp.concat(wasteCard).sort((a, b) => {
return a - b;
});
result.push(temp);
}
}
}
break;
}
if (putType.type != "zha" && zhaAcount.length > 0) {
zhaAcount.forEach(item => {
result.push(item);
});
}
return result;
}
function createShun(start, len) {
var array = [];
for (var i = 0; i < len; i++) {
array.push(start + i);
}
return array;
}
function doubleArray(array) {
var temp = [];
array.forEach(item => {
temp = temp.concat([item, item]);
})
return temp;
}
function getWasteCard(obj, judgeArray) {
var needNum = judgeArray.length * 2;
var countValue = [{}, {}, {}, {}];
var array = [];
var count = 0;
var lastValue = [];
countValue.num = 0;
for (var item in obj) {
if (judgeArray.indexOf(parseInt(item)) != -1) {
obj[item] -= 3;
if (obj[item] == 0) continue;
}
var value = obj[item];
countValue[value - 1][item] = value;
countValue.num += value;
}
for (var i = 0; i < 4; i++) {
fitValue(countValue[i], i + 1);
}
if (count < needNum) {
for (var i = 0; i < 4; i++) {
if (JSON.stringify(countValue[i]) == '{}') continue;
for (var item in countValue[i]) {
var value = parseInt(item);
lastValue = lastValue.concat(new Array(countValue[i][item]).fill(value));
}
}
if (lastValue.length > 0) {
lastValue.sort((a, b) => {
return a - b;
});
array = array.concat(lastValue.slice(0, needNum - count));
}
}
return array;
function fitValue(obj, number) {
if (JSON.stringify(obj) == '{}') return;
if (count >= needNum) return;
for (var item in obj) {
var value = parseInt(item);
count += number;
if (count <= needNum) {
array = array.concat(new Array(number).fill(value));
delete obj[item];
if (count == needNum) {
return array;
}
} else {
count -= number;
}
}
}
}
function hasPair(array, obj, acount) {
var len = array.length;
for (var i = 0; i < len; i++) {
var item = array[i];
if (!obj[item]) return false;
if (obj[item] < acount) return false;
}
return true;
}
function buildArray(number, n) {
var array = [];
for (var i = 0; i < n; i++) {
array.push(number);
number++;
}
return array;
}
function countAll(orignArray) {
var obj = {};
orignArray.forEach(item => {
var value = item.weight;
obj[value] ? obj[value]++ : (obj[value] = 1);
})
return obj;
}
function getWeight(target) {
var obj = [];
target.forEach(item => {
obj.push(item.weight);
});
return obj;
}
//卡牌类型转换
function convertCard(array) {
var backArray = [];
var len = array.length;
var item;
for (var i = 0; i < len; i++) {
item = {};
item.value = array[i] % 20;
item.color = parseInt(array[i] / 20);
item.weight = weight[item.value];
item.orgin = array[i];
backArray.push(item);
}
sortCard(backArray);
return backArray;
}
//卡牌权重排序
function sortCard(array) {
Array.prototype.sort.call(array, (a, b) => {
var flag = a.weight - b.weight;
return flag == 0 ? a.color - b.color : flag;
})
}
//获取打出的牌类型
function getType(cards) {
var valueArray = [];
cards.forEach(item => {
valueArray.push(item.weight);
});
var type = null;
type = judgeDan(valueArray, type);
type = judgeDui(valueArray, type);
type = judgeShun(valueArray, type);
type = judgeZha(valueArray, type);
type = judgePlane(valueArray, type);
return type;
}
//单牌
function judgeDan(array, type) {
if (type) return type;
if (array.length == 1 && !type) {
type = {type: "dan", count: 1, value: array[0]};
}
return type;
}
//对子,包括连对
function judgeDui(array, type) {
if (type) return type;
var judge = Array.unique(array);
var tempArr = doubleArray(judge);
var len = judge.length;
var num = PaiConfig.duishunNum;
if (tempArr.toString() == array.toString()) {
if (judge.length == 1) {
type = {type: "dui", count: 1, value: judge[0]}
} else if (shun(judge, num)) {
type = {type: "liandui", count: len, value: judge}
}
}
return type;
}
//检测炸弹
function judgeZha(array, type) {
if (type) return type;
if (same(array, 4)) {
type = {type: "zha", count: 1, value: array[0]}
}
return type;
}
//检测顺子
function judgeShun(array, type) {
if (type) return type;
var num = PaiConfig.danshunNum;
if (shun(array, num)) {
type = {type: "shun", count: 1, value: [].concat(array)};
}
return type;
}
//检测3带2或者飞机
function judgePlane(array, type) {
if (type) return type;
var obj = {};
var count_three = 0;
var len = array.length;
var value = [];
array.forEach(item => {
!obj[item] ? (obj[item] = 1) : obj[item]++;
});
for (var item in obj) {
if (obj[item] >= 3) {
count_three++;
value.push(parseInt(item));
}
}
value.sort((a, b) => {
return a - b;
});
var count = Math.ceil(len / 5);
if (value.length > count) {
value = getValue(count, value);
}
type = {type: "sanDai", count: value.length, value: value};
if (type.count > 1) type.type = "plane";
return type;
function getValue(count, value) {
var len = value.length;
var doFor = len - count;
value.reverse();
var temp;
for (var i = 0; i <= doFor; i++) {
temp = value.slice(i, i + count);
if (shun(temp)) {
value = temp;
return value;
}
}
return [];
}
}
//检测顺子
function shun(array, count) {
if (!Array.isArray(array)) return false;
var len = array.length;
if (array.length == 0) return false;
if (count && count > len) return false;
array.sort((a, b) => {
return a - b;
});
var temp = array[0];
for (var i = 0; i < count; i++) {
if (array[i] != temp + i) return false;
}
return true;
}
//检测同张
function same(array, count) {
if (!Array.isArray(array)) return false;
var len = array.length;
if (count != len) return false;
var temp = array[0];
for (var i = 0; i < count; i++) {
if (array[i] != temp) return false;
}
return true;
}
}());
RoomFunc.tip_put_card = function (hand, pdkConfig) {
var result = {};
result.weight = [];
var backArr = [];
if (hand && Object.prototype.toString.call(hand) === '[object Array]' && hand.length) {
var jing = [];
var arr = [].concat(hand);
ord(arr);
arr.includes(101) && arr.splice(arr.indexOf(101), 1) && jing.push(101);
arr.includes(102) && arr.splice(arr.indexOf(102), 1) && jing.push(102);
if (!arr.length) {
return hand;
}
var processArr = [].concat(arr);
processArr = processArr.map(function (item) { //处理手牌
item = item % 20;
if (item < 3) {
return item + 13;
}
return item;
});
ord(processArr); //手牌排序
var single = [],
duizi = [],
kezi = [],
shunzi = [],
liandui = [],
feiji = [],
zha = [];
var countObj = [{}, {}, {}, {}];
processArr.forEach(function (item) {
processArr.indexOf(item) === processArr.lastIndexOf(item) && !single.includes(item) && single.push(item) && (countObj[0][item] = 1);
processArr.indexOf(item) + 1 === processArr.lastIndexOf(item) && !duizi.includes(item) && duizi.push(item) && (countObj[1][item] = 2);
processArr.indexOf(item) + 2 === processArr.lastIndexOf(item) && !kezi.includes(item) && kezi.push(item) && (countObj[2][item] = 3);
processArr.indexOf(item) + 3 === processArr.lastIndexOf(item) && !zha.includes(item) && zha.push(item) && (countObj[3][item] = 4);
});
var arr1 = [];
processArr.filter(function (item) { //手牌去重
return arr1.includes(item) ? '' : arr1.push(item);
});
shunzi = arr1.length ? check_shunzi(arr1, pdkConfig.danshunNum) : [];
liandui = duizi.length ? check_liandui(duizi, pdkConfig.duishunNum) : [];
feiji = kezi.length ? check_feiji(kezi, 2) : [];
var s = shunzi.length && shunzi.reduce(function (prev, cur) {
return prev.concat(cur);
});
if (s) {
single = single.filter(function (item) {
return !s.includes(item);
});
duizi = duizi.filter(function (item) {
return !s.includes(item);
});
}
process(liandui, 'liandui');
process(shunzi, 'shunzi');
process(duizi, 'duizi');
process(single, 'single');
process(kezi, 'kezi');
process(feiji, 'feiji');
process(zha, 'zha');
jing.length && (result[4] = jing);
}
return sortResult();
function sortResult() {
var array = ['feiji', 'shunzi', 'liandui'];
if (pdkConfig.sandaiOrNot) {
array.push('kezi');
}
result.weight.sort(function (a, b) {
return a[1] - b[1];
});
var len = result.weight.length;
for (var i = 0; i < len; i++) {
array.push(result.weight[i][0]);
}
array.push('zha');
var lastLen = array.length;
var temp;
var tempLen;
for (var i = 0; i < lastLen; i++) {
var temp = result[array[i]];
if (temp) {
tempLen = temp.length;
for (var j = 0; j < tempLen; j++) {
backArr.push(temp[j]);
}
}
}
return backArr;
}
function process(array, type) {
if (!array || !array.length) return;
var temp;
switch (type) {
case 'liandui':
temp = array.map(function (item) {
return convert(multArr(item, 2), hand);
});
break;
case 'shunzi':
temp = array.map(function (item) {
return convert(item, hand);
});
break;
case 'duizi':
result.weight.push(['duizi', array[0]]);
temp = array.map(function (item) {
return convert([item, item], hand);
});
break;
case 'single':
result.weight.push(['single', array[0]]);
temp = array.map(function (item) {
return convert([item], hand);
});
break;
case 'zha':
temp = array.map(function (item) {
return convert([item, item, item, item], hand);
});
break;
case 'kezi':
!pdkConfig.sandaiOrNot && result.weight.push(['kezi', array[0]]);
temp = array.map(function (item) {
return convert([item, item, item].concat(getWasteCard([item])), hand);
});
break;
case 'feiji':
temp = array.map(function (item) {
return convert(multArr(item, 3).concat(getWasteCard(item)), hand);
});
break;
}
result[type] = temp;
}
function multArr(array, num) {
var temp = [].concat(array);
var back = [];
for (var i = 0; i < num; i++) {
back = back.concat(temp);
}
return back;
}
function ord(arr) {
arr.sort(function (a, b) {
return a - b;
});
}
function getWasteCard(judgeArray) {
if (!pdkConfig.sandaiOrNot) {
return [];
}
var num = pdkConfig.daiNum ? pdkConfig.daiNum : 2;
var judgeLen = judgeArray.length;
var needNum = judgeLen * num;
var countValue = copyObj(countObj);
countValue.num = processArr.length;
var array = [];
var count = 0;
var lastValue = [];
var temp;
for (var i = 2; i < 4; i++) {
for (var j = 0; j < judgeLen; j++) {
temp = countValue[i][judgeArray[j]];
if (temp) {
temp -= 3;
countValue.num -= 3;
if (temp == 0) {
delete countValue[i][judgeArray[j]];
}
}
}
}
for (var i = 0; i < 4; i++) {
fitValue(countValue[i], i + 1);
}
if (count < needNum) {
for (var i = 0; i < 4; i++) {
if (JSON.stringify(countValue[i]) == '{}') continue;
for (var item in countValue[i]) {
var value = parseInt(item);
lastValue = lastValue.concat(new Array(countValue[i][item]).fill(value));
}
}
if (lastValue.length > 0) {
lastValue.sort((a, b) => {
return a - b;
});
array = array.concat(lastValue.slice(0, needNum - count));
}
}
return array;
function copyObj(obj) {
if (typeof(obj) == 'object') {
return JSON.parse(JSON.stringify(obj));
}
}
function fitValue(obj, number) {
if (JSON.stringify(obj) == '{}') return;
if (count >= needNum) return;
for (var item in obj) {
var value = parseInt(item);
count += number;
if (count <= needNum) {
array = array.concat(new Array(number).fill(value));
delete obj[item];
if (count == needNum) {
return array;
}
} else {
count -= number;
}
}
}
}
function convert(arr, hand) {
var arr1 = [].concat(hand);
var length = arr1.length;
var arr2 = [];
arr2 = arr.map(function (item, index) {
if (item > 13) {
item = item - 13;
}
for (var i = 0; i < length; i++) {
if (arr1[i] % 20 == item && arr1[i] < 100) {
item = arr1[i];
arr1.splice(i, 1);
break;
}
}
return item;
});
arrange_pai(arr2);
return arr2;
}
function arrange_pai(hand) {
hand.sort(function (a, b) {
var c = a % 20;
var d = b % 20;
c < 3 && (c += 20);
d < 3 && (d += 20);
var result = d - c;
if (d == c || a > 100 || b > 100) {
result = b - a;
}
return result;
})
}
function check_shunzi(hand, num) {
var arr = [].concat(hand);
var result = [],
i = 0;
result[i] = [arr[0]];
arr.reduce(function (prev, cur) {
cur - prev === 1 ? result[i].push(cur) : result[++i] = [cur];
return cur;
});
result = result.filter(function (item, index) {
return item.length > num - 1;
});
return result;
}
function check_liandui(hand, num) {
return check_shunzi(hand, num);
}
function check_feiji(hand, num) {
return check_shunzi(hand, num);
}
}
RoomFunc.compare_array = function (obj, target) {
var base = [].concat(obj).sort(function (a, b) {
return a - b;
});
var next = [].concat(target).sort(function (a, b) {
return a - b;
});
return base.toString() == next.toString();
}