// ==UserScript== // @name 雀魂回放编辑器Replay_Editor // @namespace http://tampermonkey.net/ // @version 0.1.3 // @description 雀魂自制回放 // @author xiaolan16 // @homepageURL https://github.com/xiaolan16/make-a-replay-in-maj-soul // @match https://game.maj-soul.com/1/ // @match https://game.mahjongsoul.com/ // @match https://mahjongsoul.game.yo-star.com/ // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @license Apache-2.0 License // @downloadURL none // ==/UserScript== class Majsoul_Replay_Editor{ save(name){ let allreplay=GM_getValue('allreplay',{}); saveproject(); loadreplay(); allreplay[name]=JSON.stringify(editdata); loadproject(lstscene); GM_setValue('allreplay',allreplay); } load(name){ let allreplay=GM_getValue('allreplay',{}); try{edit(JSON.parse(allreplay[name]))}catch(e){throw(e);} } saveproject(name){ let project=GM_getValue('project',{}); saveproject(); project[name]=JSON.stringify(lstscene); GM_setValue('project',project); } loadproject(name){ let project=GM_getValue('project',{}); loadproject(JSON.parse(project[name])); } open(){ unsafeWindow.editdata=editdata; unsafeWindow.settings=settings; unsafeWindow.gamebegin=gamebegin; unsafeWindow.gameend=gameend; unsafeWindow.edit=edit; unsafeWindow.canceledit=canceledit; unsafeWindow.roundbegin=roundbegin; unsafeWindow.roundend=roundend; unsafeWindow.randompaishan=randompaishan; unsafeWindow.tiles0=tiles0; unsafeWindow.tiles1=tiles1; unsafeWindow.tiles2=tiles2; unsafeWindow.tiles3=tiles3; unsafeWindow.paishan=paishan; unsafeWindow.muyuseats=muyuseats; unsafeWindow.discardtiles=discardtiles; unsafeWindow.mopai=mopai; unsafeWindow.qiepai=qiepai; unsafeWindow.mingpai=mingpai; unsafeWindow.leimingpai=leimingpai; unsafeWindow.notileliuju=notileliuju; unsafeWindow.liuju=liuju; unsafeWindow.hupai=hupai; unsafeWindow.huansanzhang=huansanzhang; unsafeWindow.dingque=dingque; } close(){ try{ delete unsafeWindow.editdata; delete unsafeWindow.settings; delete unsafeWindow.gamebegin; delete unsafeWindow.gameend; delete unsafeWindow.edit; delete unsafeWindow.canceledit; delete unsafeWindow.roundbegin; delete unsafeWindow.roundend; delete unsafeWindow.randompaishan; delete unsafeWindow.tiles0; delete unsafeWindow.tiles1; delete unsafeWindow.tiles2; delete unsafeWindow.tiles3; delete unsafeWindow.paishan; delete unsafeWindow.muyuseats; delete unsafeWindow.discardtiles; delete unsafeWindow.mopai; delete unsafeWindow.qiepai; delete unsafeWindow.mingpai; delete unsafeWindow.leimingpai; delete unsafeWindow.notileliuju; delete unsafeWindow.liuju; delete unsafeWindow.hupai; delete unsafeWindow.huansanzhang; delete unsafeWindow.dingque; }catch(e){throw(e);} } } function editfunction(){ ! function(t) { var e = function(e) { function i() { return null !== e && e.apply(this, arguments) || this } return __extends(i, e), i.play = function(e) { app.Log.log("ActionDiscardTile play data:" + JSON.stringify(e)), e.doras && t.DesktopMgr.Inst.WhenDoras(e.doras, !1); var i = e.seat, n = mjcore.MJPai.Create(e.tile), a = !(null == e.is_liqi || void 0 == e.is_liqi || !e.is_liqi); if(e.muyu && t.DesktopMgr.Inst.onMuyuChange(e.muyu, !0), t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].AddQiPai(n, a, e.moqie), a) { e.is_wliqi ? t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].PlaySound("act_drich") : t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].PlaySound("act_rich"); var r = t.DesktopMgr.Inst.player_effects[i][game.EView.lizhi_bgm]; if(r && 0 != r) { var s = cfg.item_definition.item.get(r).sargs[0]; t.AudioMgr.lizhiMuted ? t.AudioMgr.PlayLiqiBgm(s, 300, !0) : (t.BgmListMgr.stopBgm(), Laya.timer.once(1e3, this, function() { t.DesktopMgr.Inst.gameing && (t.BgmListMgr.PlayMJBgm("", !0), t.AudioMgr.PlayLiqiBgm(s, 300, !0)) })) } } var o = !1; e.tile_state && e.tile_state > 0 && (o = !0), i == t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.OnDiscardTile(n, o, !1, e.moqie) : t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].onDiscardTile(e.moqie, e.tile, o, !1), e.operation && Laya.timer.once(500, this, function() { t.ActionOperation.play(e.operation) }), void 0 != e.zhenting && void 0 == e.operation && (uiscript.UI_DesktopInfo.Inst.setZhenting(e.zhenting), uiscript.UI_TingPai.Inst.setZhengting(e.zhenting)), i == t.DesktopMgr.Inst.seat && uiscript.UI_TingPai.Inst.setData1(e, !1), Laya.timer.once(500, this, function() { a ? t.DesktopMgr.Inst.clearMindVoice() : t.DesktopMgr.Inst.playMindVoice() }) }, i.fastplay = function(e, i) { app.Log.log("ActionDiscardTile fastplay data:" + JSON.stringify(e) + " usetime:" + i), e.doras && t.DesktopMgr.Inst.WhenDoras(e.doras, !0); var n = e.seat, a = mjcore.MJPai.Create(e.tile), r = !(null == e.is_liqi || void 0 == e.is_liqi || !e.is_liqi), s = !1; e.tile_state && e.tile_state > 0 && (s = !0), t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].AddQiPai(a, r, e.moqie, !1), e.muyu && t.DesktopMgr.Inst.onMuyuChange(e.muyu, !1), n == t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.OnDiscardTile(a, s, !0, e.moqie) : t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].onDiscardTile(e.moqie, e.tile, s, !0), e.operation && -1 != i && Laya.timer.once(500, this, function() { t.ActionOperation.play(e.operation, i) }), void 0 != e.zhenting && void 0 == e.operation && (uiscript.UI_DesktopInfo.Inst.setZhenting(e.zhenting), uiscript.UI_TingPai.Inst.setZhengting(e.zhenting)), n == t.DesktopMgr.Inst.seat && uiscript.UI_TingPai.Inst.setData1(e, !0) }, i.record = function(e, i) { void 0 === i && (i = 0), app.Log.log("ActionDiscardTile record data:" + JSON.stringify(e)), e.doras && t.DesktopMgr.Inst.WhenDoras(e.doras, !0); var n = e.seat, a = mjcore.MJPai.Create(e.tile), r = !(null == e.is_liqi || void 0 == e.is_liqi || !e.is_liqi), s = !1; if(e.is_kailiqi){ if(e.seat!=view.DesktopMgr.Inst.seat){ for(let i=0;i 0 && (s = !0), e.muyu && t.DesktopMgr.Inst.onMuyuChange(e.muyu, !0), t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].AddQiPai(a, r, e.moqie), r && (e.is_wliqi ? t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].PlaySound("act_drich") : t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].PlaySound("act_rich"), uiscript.UI_DesktopInfo.Inst.changeHeadEmo(n, "emoji_9", 2e3)), n == t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.OnDiscardTile(a, s, !1, e.moqie) : t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].recordDiscardTile(a, e.moqie, s, !1), e.tingpais && t.DesktopMgr.Inst.setTingpai(e.seat, e.tingpais), t.DesktopMgr.Inst.mode == t.EMJMode.live_broadcast && uiscript.UI_Live_Broadcast.Inst.during_play && e.operations) for(var o = 0; o < e.operations.length; o++) t.ActionOperation.ob(e.operations[o], i, 450); return 500 }, i.fastrecord = function(e, i) { void 0 === i && (i = -1), app.Log.log("ActionDiscardTile fastrecord data:" + JSON.stringify(e)), e.doras && t.DesktopMgr.Inst.WhenDoras(e.doras, !0); var n = e.seat, a = mjcore.MJPai.Create(e.tile), r = !(null == e.is_liqi || void 0 == e.is_liqi || !e.is_liqi), s = !1; if(e.is_kailiqi){ if(e.seat!=view.DesktopMgr.Inst.seat){ for(let i=0;i 0 && (s = !0), e.muyu && t.DesktopMgr.Inst.onMuyuChange(e.muyu, !1), t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].AddQiPai(a, r, e.moqie, !1), n == t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.OnDiscardTile(a, s, !0, e.moqie) : t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].recordDiscardTile(a, e.moqie, s, !0), e.tingpais && t.DesktopMgr.Inst.setTingpai(e.seat, e.tingpais), t.DesktopMgr.Inst.mode == t.EMJMode.live_broadcast && uiscript.UI_Live_Broadcast.Inst.during_play && i >= 0 && e.operations) for(var o = 0; o < e.operations.length; o++) t.ActionOperation.ob(e.operations[o], i, 450) }, i }(t.ActionBase); t.ActionDiscardTile = e }(view || (view = {})); !function(t){ var e=function(e){ function i(){ return null!==e&&e.apply(this,arguments)||this } return __extends(i,e),i.play=function(e){ app.Log.log("ActionBabei play data:"+JSON.stringify(e)),e.doras&&t.DesktopMgr.Inst.WhenDoras(e.doras,!1); var i=e.seat,n; e.tile?n=mjcore.MJPai.Create(e.tile):n=mjcore.MJPai.Create("4z"); t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].AddBabei(n,e.moqie,!0),t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].PlaySound("act_babei"); var a=!1; e.tile_state&&e.tile_state>0&&(a=!0),e.muyu&&t.DesktopMgr.Inst.onMuyuChange(e.muyu,!0),i==t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.onBabei(n,a,!1):t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(i)].onBabei(e.moqie,a,!1),e.operation&&Laya.timer.once(500,this,function(){ t.ActionOperation.play(e.operation) }),void 0 !=e.zhenting&&void 0==e.operation&&(uiscript.UI_DesktopInfo.Inst.setZhenting(e.zhenting),uiscript.UI_TingPai.Inst.setZhengting(e.zhenting)),i==t.DesktopMgr.Inst.seat&&uiscript.UI_TingPai.Inst.setData1(e,!1),t.DesktopMgr.Inst.waiting_lingshang_deal_tile=!0 },i.fastplay=function(e,i){ app.Log.log("ActionBabei fastplay data:"+JSON.stringify(e)+" usetime:"+i),e.doras&&t.DesktopMgr.Inst.WhenDoras(e.doras,!0); var n=e.seat,a; e.tile?a=mjcore.MJPai.Create(e.tile):a=mjcore.MJPai.Create("4z"); t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].AddBabei(a,e.moqie,!1); var r=!1; e.tile_state&&e.tile_state>0&&(r=!0),e.muyu&&t.DesktopMgr.Inst.onMuyuChange(e.muyu,!1),n==t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.onBabei(a,r,!0):t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].onBabei(e.moqie,r,!0),e.operation&&-1 !=i&&Laya.timer.once(500,this,function(){ t.ActionOperation.play(e.operation,i) }),void 0 !=e.zhenting&&void 0==e.operation&&(uiscript.UI_DesktopInfo.Inst.setZhenting(e.zhenting),uiscript.UI_TingPai.Inst.setZhengting(e.zhenting)),n==t.DesktopMgr.Inst.seat&&uiscript.UI_TingPai.Inst.setData1(e,!0),t.DesktopMgr.Inst.waiting_lingshang_deal_tile=!0 },i.record=function(e,i){ void 0===i&&(i=0),app.Log.log("ActionBabei record data:"+JSON.stringify(e)),e.doras&&t.DesktopMgr.Inst.WhenDoras(e.doras,!0); var n=e.seat,a; e.tile?a=mjcore.MJPai.Create(e.tile):a=mjcore.MJPai.Create("4z"); t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].AddBabei(a,e.moqie,!0),t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].PlaySound("act_babei"); var r=!1; if(e.tile_state&&e.tile_state>0&&(r=!0),e.muyu&&t.DesktopMgr.Inst.onMuyuChange(e.muyu,!0),n==t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.onBabei(a,r,!1):t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].recordBabei(a,e.moqie,r,!1),e.tingpais&&t.DesktopMgr.Inst.setTingpai(e.seat,e.tingpais),t.DesktopMgr.Inst.mode==t.EMJMode.live_broadcast&&uiscript.UI_Live_Broadcast.Inst.during_play&&e.operations) for(var s=0;s0&&(r=!0),e.muyu&&t.DesktopMgr.Inst.onMuyuChange(e.muyu,!1),n==t.DesktopMgr.Inst.seat ? t.DesktopMgr.Inst.mainrole.onBabei(a,r,!0):t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(n)].recordBabei(a,e.moqie,r,!0),e.tingpais&&t.DesktopMgr.Inst.setTingpai(e.seat,e.tingpais),t.DesktopMgr.Inst.mode==t.EMJMode.live_broadcast&&uiscript.UI_Live_Broadcast.Inst.during_play&&i>=0&&e.operations) for(var s=0;s=0&&(o=t.DesktopMgr.Inst.player_effects[l][game.EView.hupai_effect]),n&&uiscript.UI_Huleshow.Inst.showRong(h),r+=n?1200:200,Laya.timer.once(r,i,function(){ if(!t.DesktopMgr.Inst.isLastPaiMingPai())t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(t.DesktopMgr.Inst.lastpai_seat)].QiPaiNoPass(); else{ t.DesktopMgr.Inst.lastqipai.lastColor=new Laya.Vector4(1,.78,.78,.4); t.DesktopMgr.Inst.lastqipai.model.meshRender.sharedMaterial.setColor(caps.Cartoon.COLOR,t.DesktopMgr.Inst.lastqipai.lastColor); t.DesktopMgr.Inst.lastqipai.model.meshRender.sharedMaterial.blend=2; t.DesktopMgr.Inst.lastqipai.val.type+=10; t.DesktopMgr.Inst.lastqipai.isxuezhanhu=!0,t.DesktopMgr.Inst.lastqipai.OnChoosedPai() } for(var e=0;e0){ o==t.DesktopMgr.Inst.seat,uiscript.UI_DesktopInfo.Inst.changeHeadEmo(o,"emoji_7",-1),l.delta=e.delta_scores[o]; for(var h=0,c=a;h=0&&(o=t.DesktopMgr.Inst.player_effects[l][game.EView.hupai_effect]),n&&uiscript.UI_Huleshow.Inst.showRong(h),r+=n?1200:200,Laya.timer.once(r,i,function(){ if(!t.DesktopMgr.Inst.isLastPaiMingPai())t.DesktopMgr.Inst.players[t.DesktopMgr.Inst.seat2LocalPosition(t.DesktopMgr.Inst.lastpai_seat)].QiPaiNoPass(); else{ t.DesktopMgr.Inst.lastqipai.lastColor=new Laya.Vector4(1,.78,.78,.4); t.DesktopMgr.Inst.lastqipai.model.meshRender.sharedMaterial.setColor(caps.Cartoon.COLOR,t.DesktopMgr.Inst.lastqipai.lastColor); t.DesktopMgr.Inst.lastqipai.model.meshRender.sharedMaterial.blend=2; t.DesktopMgr.Inst.lastqipai.val.type+=10; t.DesktopMgr.Inst.lastqipai.isxuezhanhu=!0,t.DesktopMgr.Inst.lastqipai.OnChoosedPai() } for(var e=0;e0){ o==t.DesktopMgr.Inst.seat,uiscript.UI_DesktopInfo.Inst.changeHeadEmo(o,"emoji_7",-1),l.delta=e.delta_scores[o]; for(var h=0,c=a;h>>(32-iShiftBits)); } function md5_AddUnsigned(lX,lY){ var lX4,lY4,lX8,lY8,lResult; lX8=(lX&0x80000000); lY8=(lY&0x80000000); lX4=(lX&0x40000000); lY4=(lY&0x40000000); lResult=(lX&0x3FFFFFFF)+(lY&0x3FFFFFFF); if(lX4&lY4)return(lResult^0x80000000^lX8^lY8); if(lX4|lY4){ if(lResult&0x40000000)return(lResult^0xC0000000^lX8^lY8); else return(lResult^0x40000000^lX8^lY8); } else return(lResult^lX8^lY8); } function md5_F(x,y,z){ return(x&y)|((~x)&z); } function md5_G(x,y,z){ return(x&z)|(y&(~z)); } function md5_H(x,y,z){ return(x^y^z); } function md5_I(x,y,z){ return(y^(x|(~z))); } function md5_FF(a,b,c,d,x,s,ac){ a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_F(b,c,d),x),ac)); return md5_AddUnsigned(md5_RotateLeft(a,s),b); }; function md5_GG(a,b,c,d,x,s,ac){ a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_G(b,c,d),x),ac)); return md5_AddUnsigned(md5_RotateLeft(a,s),b); }; function md5_HH(a,b,c,d,x,s,ac){ a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_H(b,c,d),x),ac)); return md5_AddUnsigned(md5_RotateLeft(a,s),b); }; function md5_II(a,b,c,d,x,s,ac){ a=md5_AddUnsigned(a,md5_AddUnsigned(md5_AddUnsigned(md5_I(b,c,d),x),ac)); return md5_AddUnsigned(md5_RotateLeft(a,s),b); }; function md5_ConvertToWordArray(string){ var lWordCount; var lMessageLength=string.length; var lNumberOfWords_temp1=lMessageLength+8; var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1%64))/64; var lNumberOfWords=(lNumberOfWords_temp2+1)*16; var lWordArray=Array(lNumberOfWords-1); var lBytePosition=0; var lByteCount=0; while(lByteCount>>29; return lWordArray; }; function md5_WordToHex(lValue){ var WordToHexValue="", WordToHexValue_temp="", lByte,lCount; for(lCount=0;lCount<=3;lCount++){ lByte=(lValue>>>(lCount*8))&255; WordToHexValue_temp="0"+lByte.toString(16); WordToHexValue=WordToHexValue+WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2); } return WordToHexValue; }; function md5_Utf8Encode(string){ string=string.replace(/\r\n/g,"\n"); var utftext=""; for(var n=0;n127)&&(c<2048)){ utftext+=String.fromCharCode((c>>6)|192); utftext+=String.fromCharCode((c&63)|128); }else{ utftext+=String.fromCharCode((c>>12)|224); utftext+=String.fromCharCode(((c>>6)&63)|128); utftext+=String.fromCharCode((c&63)|128); } } return utftext; }; var x=Array(); var k,AA,BB,CC,DD,a,b,c,d; var S11=7, S12=12, S13=17, S14=22; var S21=5, S22=9, S23=14, S24=20; var S31=4, S32=11, S33=16, S34=23; var S41=6, S42=10, S43=15, S44=21; string=md5_Utf8Encode(string); x=md5_ConvertToWordArray(string); a=0x67452301; b=0xEFCDAB89; c=0x98BADCFE; d=0x10325476; for(k=0;k0){ ret.push(x.substring(0,2)); x=x.substring(2); } return ret; } function getlstaction(x){ if(x==undefined)x=1; let ret=actions.length; for(let i=1;i<=x;i++){ ret--; while(actions[ret]!=undefined&&(actions[ret].name=="RecordSelectGap"||actions[ret].name=="RecordGangResult"))ret--; } return actions[ret]; } var nxt2=[0,2,3,4,5,6,7,8,9,35,11,12,13,14,15,16,17,18,35,20,21,22,23,24,25,26,27,35,35,35,35,35,35,35,35,36,0,0,0,0]; var doranxt=[0,2,3,4,5,6,7,8,9, 1,11,12,13,14,15,16,17,18,10,20,21,22,23,24,25,26,27,19,29,30,31,28,33,34,32]; function equaltile(x,y){ if(x[1]==y[1]&&x[0]=='0'&&y[0]=='5')return 1; if(x[1]==y[1]&&x[0]=='5'&&y[0]=='0')return 1; if(x==y)return 1; return 0; } function tiletoint(tile,type){ if(type!=undefined){ if(tile=="0m")return 35; if(tile=="0p")return 36; if(tile=="0s")return 37; } if(tile[0]=='0')tile='5'+tile[1]; if(tile[1]=='m')return parseInt(tile); if(tile[1]=='p')return 9+parseInt(tile); if(tile[1]=='s')return 18+parseInt(tile); if(tile[1]=='z')return 27+parseInt(tile); } function inttotile(x){ if(x>=1&&x<=9)return x.toString()+"m"; if(x>=10&&x<=18)return (x-9).toString()+"p"; if(x>=19&&x<=27)return (x-18).toString()+"s"; if(x>=28&&x<=34)return (x-27).toString()+"z"; if(x==35)return "0m"; if(x==36)return "0p"; if(x==37)return "0s"; } function huazhu(seat){ for(let i=0;i0){ mingpais[seat][tile]--; return 1; } return 0; } function calchupai(tls){ let cnt=[],tmp=[]; for(let i=0;i<=36;i++){cnt[i]=0;tmp[i]=0;} for(let i=0;i4)return 0; for(let i=1;i<=34;i++){ if(cnt[i]>=2){ let ok=1; cnt[i]-=2; for(let j=1;j<=34;j++)tmp[j]=cnt[j]; for(let k=1;k<=3;k++){ for(let j=k*9-8;j;j=nxt2[j]){ if(tmp[j]<0){ ok=0; break; } tmp[j]%=3; tmp[nxt2[j]]-=tmp[j]; tmp[nxt2[nxt2[j]]]-=tmp[j]; } tmp[35]=tmp[36]=0; } for(let j=28;j<=34;j++)if(tmp[j]%3!=0)ok=0; cnt[i]+=2; if(ok)return 1; } } let duizi=0; for(let i=1;i<=34;i++){ if(cnt[i]==2)duizi++; if(cnt[i]==4&&is_chuanma())duizi+=2; } if(duizi==7)return 2; let guoshi=1; for(let i=1;i<=34;i++){ if(i==1||i==9||i==10||i==18||i==19||i>=27&&i<=34){if(cnt[i]==0)guoshi=0;} else if(cnt[i]!=0)guoshi=0; } if(guoshi)return 3; return 0; } function tingpai(seat){ if(is_chuanma()&&huazhu(seat))return []; let tls=playertiles[seat]; let cnt=[]; for(let i=0;i<=36;i++)cnt[i]=0; for(let i=0;i=0;i--)if(fulu[seat][i].type==3)cnt[tiletoint(fulu[seat][i].tile[0])]+=4; let res=[]; for(let i=1;i<=34;i++){ tls.push(inttotile(i)); cnt[i]++; if(cnt[i]<5&&calchupai(tls)!=0)res.push({'tile':inttotile(i)}); tls.length=tls.length-1; cnt[i]--; } return res; } function inserthules_history(x){ let flag=false; for(let i=0;i=8&&val<=10)return 4000+type*val; else if(val==11||val==12)return 6000+type*val; else if(val>=13)return 8000+type*val; else return Math.min(Math.pow(2,val+2)*x.fu,2000)+type*val; } //0:副露的顺子 1:副露的刻子 2:明杠 //3:暗杠 4:拔北宝牌 5:未副露的顺子 //6:未副露的刻子 7:对子 //1~64 //自摸 立直 抢杠 岭上 海底 河底 白 发 中 门风 //场风 断幺 一杯 平和 混全 一气 三色 w立 三同刻 三杠 //对对 三暗 小三元 混老头 七对 纯全 混 二杯 清 一发 //dora 红宝 里宝 北宝 天和 地和 带三元 四暗 字一色 绿一色 //清老头 国士 小四喜 四杠 九莲 八连庄 纯九 四单 十三面 带四喜 //燕返 杠振 十二落抬 五门齐 三连刻 三同顺 1p摸月 9p捞鱼 人和 带车轮 //大竹林 大数邻 石上 带七星 function calcfan_chuanma(tls,seat,zimo,type){ if(tls.length%3==1){ let tingpais=tingpai(seat),ret=[]; for(let i=0;icalcsudian_chuanma(ret,1))ret=tmp; tls.length--; } return ret; } let vals=[]; function tofan(x){ let ans=[]; for(let i=1019;i>=1005;i--){ if(i==1014&&x[1020]){ ans.push({'val':x[1020],'id':1020}); break; } if(x[i]){ ans.push({'val':x[i],'id':i}); break; } if(i==1005&&ans.length==0){ans.push({'val':x[1003],'id':1003});} } if(x[1000])ans.push({'val':x[1000],'id':1000}); if(x[1001])ans.push({'val':x[1001],'id':1001}); if(x[1002])ans.push({'val':x[1002],'id':1002}); if(x[1004])ans.push({'val':x[1004],'id':1004}); if(x[1021])ans.push({'val':x[1021],'id':1021}); return ans; } let lsttile=tls[tls.length-1],fulucnt=0; let ret=[]; let cnt=[]; for(let i=0;i<=36;i++){cnt[i]=0;} for(let i=0;icalcsudian_chuanma(ret,1))ret=x; } function calc(){ let cnt2=[]; for(let i=0;i<=36;i++)cnt2[i]=0; let partitiontmp=[].concat(partition); for(let i=partitiontmp.length-1;i>=0;i--){ let tiles=partitiontmp[i].tile; if(partitiontmp[i].type==0||partitiontmp[i].type==5){ cnt2[tiletoint(tiles[0])]++; cnt2[tiletoint(tiles[1])]++; cnt2[tiletoint(tiles[2])]++; } else if(partitiontmp[i].type==1||partitiontmp[i].type==6)cnt2[tiletoint(tiles[0])]+=3; else if(partitiontmp[i].type==2||partitiontmp[i].type==3)cnt2[tiletoint(tiles[0])]+=4; else if(partitiontmp[i].type==7)cnt2[tiletoint(tiles[0])]+=2; } function calc0(){ let ans=[]; let typecnt=[]; for(let i=0;i<=34;i++)typecnt[i]=[0,0,0]; for(let i=0;i0)quandai=false; if(i!=1&&i!=9&&i!=10&&i!=18&&i!=19&&i!=27&&i<28&&typecnt[i][1]!=0)quandai=false; } //-------------------------- let qingyise=false; for(let k=0;k<=3;k++){ qingyise=true; for(let i=1;i<=34;i++){ if(Math.floor((i-1)/9)!=k&&i<=27&&cnt2[i]>0)qingyise=false; } if(qingyise==true)break; } //-------------------------- let gangzi=0,kezi=0,duizi=0; for(let i=1;i<=34;i++){ if(typecnt[i][0]==3||typecnt[i][0]==2)gangzi++; if(typecnt[i][1]==2)kezi++; } if(partitiontmp.length==7)duizi=7; //--------------------------- let jiangdui=true; for(let i=1;i<=34;i++){ if(i!=2&&i!=5&&i!=8&&i!=11&&i!=14&&i!=17&&i!=20&&i!=23&&i!=26&&cnt2[i]>0)jiangdui=false; } //--------------------------- if(settings.chuanma_points_method){ ans.push({'val':1,'id':1003}); ans.push({'val':0,'id':1000}); for(let i=1;i<=34;i++)if(cnt2[i]==4)ans[1].val++; if(ans[1].val==0)ans.length--; if(type!=1&&zimo&&getlstaction(2)!=undefined&&(getlstaction(2).name=="RecordAnGangAddGang"||getlstaction(2).name=="RecordChiPengGang"))ans.push({'val':1,'id':1001}); if(type!=1&&!zimo&&getlstaction().name!="RecordAnGangAddGang"&&getlstaction(3)!=undefined&&(getlstaction(3).name=="RecordAnGangAddGang"||getlstaction(3).name=="RecordChiPengGang"))ans.push({'val':1,'id':1002}); if(type!=1&&getlstaction().name=="RecordAnGangAddGang")ans.push({'val':1,'id':1004}); if(kezi==4)ans.push({'val':1,'id':1005}); if(qingyise)ans.push({'val':2,'id':1006}); if(duizi==7)ans.push({'val':2,'id':1007}); if(quandai)ans.push({'val':2,'id':1008}); if(fulucnt==4)ans.push({'val':1,'id':1009}); if(jiangdui)ans.push({'val':2,'id':1011}); if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat==ju&&zimo)ans.push({'val':5,'id':1018}); if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat!=ju&&zimo)ans.push({'val':5,'id':1019}); if(type!=1&&paishan.length/2==0)ans.push({'val':1,'id':1021}); return ans; } else{ ans[1000]=0; for(let i=1;i<=34;i++)if(cnt2[i]==4)ans[1000]++;//根 if(type!=1&&zimo&&getlstaction(2)!=undefined&&(getlstaction(2).name=="RecordAnGangAddGang"||getlstaction(2).name=="RecordChiPengGang"))ans[1001]=1;//杠上花 if(type!=1&&!zimo&&getlstaction().name!="RecordAnGangAddGang"&&getlstaction(3)!=undefined&&(getlstaction(3).name=="RecordAnGangAddGang"||getlstaction(3).name=="RecordChiPengGang"))ans[1002]=1;//杠上炮 ans[1003]=1; if(type!=1&&getlstaction().name=="RecordAnGangAddGang")ans[1004]=1;//抢杠 if(kezi==4)ans[1005]=2;//对对和 if(qingyise)ans[1006]=3;//清一色 if(duizi==7)ans[1007]=3;//七对子 if(quandai)ans[1008]=3;//带幺九 if(fulucnt==4)ans[1009]=3;//金钩钩 if(qingyise&&kezi==4)ans[1010]=4;//清对 if(jiangdui&&kezi==4)ans[1011]=4;//将对 if(ans[1000]>0&&duizi==7){ans[1012]=4;ans[1000]--;}//龙七对 if(qingyise&&duizi==7)ans[1013]=5;//清七对 if(qingyise&&fulucnt==4)ans[1014]=5;//清金钩钩 if(qingyise&&ans[1012]==4)ans[1015]=6;//清龙七对 if(gangzi==4){ans[1016]=6;ans[1000]-=4;}//十八罗汉 if(qingyise&&gangzi==4)ans[1017]=6;//清十八罗汉 if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat==ju&&zimo)ans[1018]=6;//天和 if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat!=ju&&zimo)ans[1019]=6;//地和 if(qingyise&&quandai)ans[1020]=5;//清带幺 if(type!=1&&paishan.length/2==0)ans[1021]=1;//海底捞月 return tofan(ans); } } for(let i=partitiontmp.length-1;i>=0;i--){ let tile=partitiontmp[i].tile,type=partitiontmp[i].type; if(type==5&&(equaltile(tile[0],lsttile)||equaltile(tile[1],lsttile)||equaltile(tile[2],lsttile))){ if(!zimo)partitiontmp[i].type=0; let midtile=inttotile((tiletoint(tile[0])+tiletoint(tile[1])+tiletoint(tile[2]))/3); if(equaltile(midtile,lsttile))updateret(calc0()); else if(tiletoint(lsttile)%9==3&&tiletoint(midtile)%9==2)updateret(calc0()); else if(tiletoint(lsttile)%9==7&&tiletoint(midtile)%9==8)updateret(calc0()); else updateret(calc0()); partitiontmp[i].type=5; } if(type==6&&equaltile(tile[0],lsttile)){ if(!zimo)partitiontmp[i].type=1; updateret(calc0()); partitiontmp[i].type=6; } if(type==7&&equaltile(tile[0],lsttile))updateret(calc0()); } } function dfs(now){ if(now==35){ if(partition.length==7||partition.length==5)calc(); return; } if(cnt[now]==0){ dfs(now+1); return; } let whatever=[0,2,3]; for(let k=0;k<3;k++){ if(cnt[now]=cnt0&&cnt[nxt2[nxt2[now]]]>=cnt0){ cnt[now]-=cnt0; cnt[nxt2[now]]-=cnt0; cnt[nxt2[nxt2[now]]]-=cnt0; for(let i=1;i<=cnt0;i++)partition.push({'type':5,'tile':[inttotile(now),inttotile(nxt2[now]),inttotile(nxt2[nxt2[now]])]}); dfs(now+1); cnt[now]+=cnt0; cnt[nxt2[now]]+=cnt0; cnt[nxt2[nxt2[now]]]+=cnt0; for(let i=1;i<=cnt0;i++)partition.length=partition.length-1; } if(k==1||k==2)partition.length=partition.length-1; cnt[now]+=whatever[k]; } } dfs(1); return ret; } function calcfan(tls,seat,zimo,fangchong){ let lsttile=tls[tls.length-1],fulucnt=0; let ret={'yiman':false,'fans':0,'fu':0}; let cnt=[],tmp=[]; for(let i=0;i<=36;i++){cnt[i]=0;tmp[i]=0;} for(let i=0;icalcsudian(ret,1))ret=x; } function calc(){ let cnt2=[]; for(let i=0;i<=36;i++)cnt2[i]=0; let partitiontmp=[].concat(partition); for(let i=partitiontmp.length-1;i>=0;i--){ let tiles=partitiontmp[i].tile; if(partitiontmp[i].type==0||partitiontmp[i].type==5){ cnt2[tiletoint(tiles[0])]++; cnt2[tiletoint(tiles[1])]++; cnt2[tiletoint(tiles[2])]++; } else if(partitiontmp[i].type==1||partitiontmp[i].type==6)cnt2[tiletoint(tiles[0])]+=3; else if(partitiontmp[i].type==2||partitiontmp[i].type==3)cnt2[tiletoint(tiles[0])]+=4; else if(partitiontmp[i].type==7)cnt2[tiletoint(tiles[0])]+=2; } function calc0(tingpaifu){ function deletefan(ans,x){ let flag=false; for(let i=0;i=2&&i<=8||i>=11&&i<=17||i>=20&&i<=26){ if(typecnt[i][1]==2&&typecnt[i-1][1]==2&&typecnt[i+1][1]==2)sanlianke=true; } if(typecnt[i][0]==7)duizi++; beikou+=Math.floor(typecnt[i][2]/2); if(Math.floor(typecnt[i][2]/3)>0)santongshun=true; } //--------------------------- let flag=[true,true,true,true,true]; for(let i=1;i<=34;i++){ if(i!=28&&i!=29&&i!=30&&i!=31&&i!=32&&i!=33&&i!=34&&cnt2[i]>0)flag[0]=false; if(i!=20&&i!=21&&i!=22&&i!=24&&i!=26&&i!=33&&cnt2[i]>0)flag[1]=false; if(i!=1&&i!=9&&i!=10&&i!=18&&i!=19&&i!=27&&cnt2[i]>0)flag[2]=false; if((i==1||i==9||i==10||i==18||i==19||i==27||i>=28&&i<=34)&&cnt2[i]>0)flag[3]=false; if((i>=2&&i<=8||i>=11&&i<=17||i>=20&&i<=26)&&cnt2[i]>0)flag[4]=false; } //--------------------------------- let wumenqi=true; if(cnt2[1]+cnt2[2]+cnt2[3]+cnt2[4]+cnt2[5]+cnt2[6]+cnt2[7]+cnt2[8]+cnt2[9]==0)wumenqi=false; if(cnt2[10]+cnt2[11]+cnt2[12]+cnt2[13]+cnt2[14]+cnt2[15]+cnt2[16]+cnt2[17]+cnt2[18]==0)wumenqi=false; if(cnt2[19]+cnt2[20]+cnt2[21]+cnt2[22]+cnt2[23]+cnt2[24]+cnt2[25]+cnt2[26]+cnt2[27]==0)wumenqi=false; if(cnt2[28]+cnt2[29]+cnt2[30]+cnt2[31]==0)wumenqi=false; if(cnt2[32]+cnt2[33]+cnt2[34]==0)wumenqi=false; //--------------------------------- let jiulian=[0,""],yiqi=false,hunyise=false,qingyise=false; let jlbd=[0,3,1,1,1,1,1,1,1,3]; for(let k=0;k<=2;k++){ if(typecnt[k*9+2][2]>0&&typecnt[k*9+5][2]>0&&typecnt[k*9+8][2]>0)yiqi=true; jiulian=[1,""]; for(let i=1;i<=9;i++)if(cnt2[k*9+i]jlbd[i])jiulian[1]=inttotile(k*9+i); break; } } for(let i=partitiontmp.length-1;i>=0;i--)if(partitiontmp[i].type==3)jiulian=[0,""]; for(let k=0;k<=3;k++){ hunyise=true;qingyise=true; for(let i=1;i<=34;i++){ if(Math.floor((i-1)/9)!=k&&cnt2[i]>0)qingyise=false; if(Math.floor((i-1)/9)!=k&&i<=27&&cnt2[i]>0)hunyise=false; } if(hunyise==true)break; } //---------------------------------- let sanse=false,sansetongke=false; for(let i=1;i<=9;i++){ if(i>=2&&i<=8&&typecnt[i][2]>0&&typecnt[i+9][2]>0&&typecnt[i+18][2]>0)sanse=true; if(typecnt[i][1]==2&&typecnt[i+9][1]==2&&typecnt[i+18][1]==2)sansetongke=true; } //---------------------------------- let chunquandai=true,hunquandai=true; for(let i=1;i<=34;i++){ if(i!=2&&i!=8&&i!=11&&i!=17&&i!=20&&i!=26&&typecnt[i][2]>0){chunquandai=false;hunquandai=false;} if(i!=1&&i!=9&&i!=10&&i!=18&&i!=19&&i!=27&&i<28&&typecnt[i][1]!=0){chunquandai=false;hunquandai=false;} if(i>=28&&i<=34&&typecnt[i][1]!=0)chunquandai=false; } //------------------------------------ let pinghu=true; if(duizi==7)pinghu=false; for(let i=1;i<=34;i++){ if(typecnt[i][1]==2)pinghu=false; if(typecnt[i][0]==7){ if(tiletoint(((seat-ju+playercnt)%playercnt+1).toString()+"z")==i)pinghu=false; if(tiletoint((chang+1).toString()+"z")==i)pinghu=false; if(i==32||i==33||i==34)pinghu=false; } } let flagcnt=0; if((tiletoint(lsttile)-1)%9>=3)if(typecnt[tiletoint(lsttile)-1][2])flagcnt++; if((tiletoint(lsttile)-1)%9<=5)if(typecnt[tiletoint(lsttile)+1][2])flagcnt++; if(flagcnt==0)pinghu=false; //------------------------------------- let alldoras=[0,0,0,0]; for(let i=0;i0)ans.fans.push({'val':1,'id':62});//大数邻 if(cnt2[11]>0)ans.fans.push({'val':1,'id':60});//大车轮 if(cnt2[20]>0)ans.fans.push({'val':1,'id':61});//大竹林 } if(liqiinfo[seat].liqi==2&&(zimo&&paishan.length/2-14==0&&lstdrawtype==1||!zimo&&paishan.length/2-14==0))ans.fans.push({'val':1,'id':63});//石上三年 if(flag[0]==true&&duizi==7){ ans=deletefan(ans,39); ans.fans.push({'val':2,'id':64}); }//大七星 } if(liqiinfo[seat].kai&&!zimo&&liqiinfo[fangchong].liqi==0){ if(liqiinfo[seat].liqi==2)ans.fans.push({'val':1,'id':18}); if(liqiinfo[seat].liqi==1)ans.fans.push({'val':1,'id':2}); } if(ans.fans.length!=0)return ans; //------------------------------------ ans.yiman=false; if(liqiinfo[seat].liqi==2)ans.fans.push({'val':2,'id':18});//双立直 if(liqiinfo[seat].liqi==1)ans.fans.push({'val':1,'id':2});//立直 if(liqiinfo[seat].kai)ans.fans[0].val++; if(liqiinfo[seat].liqi!=0&&liqiinfo[seat].yifa!=0)ans.fans.push({'val':1,'id':30});//一发 if(is_guyi()){ if(lstaction.name=="RecordDiscardTile"&&lstaction.data.is_liqi)ans.fans.push({'val':1,'id':51});//燕返 if(!zimo&&lstdrawtype==0)ans.fans.push({'val':1,'id':52});//杠振 if(fulucnt==4)ans.fans.push({'val':1,'id':53});//十二落抬 } if(fulucnt==0&&zimo)ans.fans.push({'val':1,'id':1});//门前清自摸和 if(lstaction.name=="RecordAnGangAddGang")ans.fans.push({'val':1,'id':3});//抢杠 if(zimo&&lstdrawtype==0)ans.fans.push({'val':1,'id':4});//岭上开花 if(zimo&&paishan.length/2-14==0&&lstdrawtype==1)ans.fans.push({'val':1,'id':5});//海底捞月 if(!zimo&&paishan.length/2-14==0)ans.fans.push({'val':1,'id':6});//河底捞鱼 if(typecnt[32][1]==2)ans.fans.push({'val':1,'id':7});//白 if(typecnt[33][1]==2)ans.fans.push({'val':1,'id':8});//发 if(typecnt[34][1]==2)ans.fans.push({'val':1,'id':9});//中 if(typecnt[tiletoint(((seat-ju+playercnt)%playercnt+1).toString()+"z")][1]==2)ans.fans.push({'val':1,'id':10});//门风 if(typecnt[tiletoint((chang+1).toString()+"z")][1]==2)ans.fans.push({'val':1,'id':11});//场风 if(flag[3]==true&&(is_shiduan()||!is_shiduan()&&fulucnt==0))ans.fans.push({'val':1,'id':12});//断幺九 if(beikou==1&&fulucnt==0)ans.fans.push({'val':1,'id':13});//一杯口 if(pinghu&&fulucnt==0)ans.fans.push({'val':1,'id':14});//平和 if(hunquandai&&!chunquandai&&!flag[4]){ if(fulucnt==0)ans.fans.push({'val':2,'id':15}); else ans.fans.push({'val':1,'id':15}); }//混全带幺九 if(yiqi){ if(fulucnt==0)ans.fans.push({'val':2,'id':16}); else ans.fans.push({'val':1,'id':16}); }//一气通贯 if(sanse){ if(fulucnt==0)ans.fans.push({'val':2,'id':17}); else ans.fans.push({'val':1,'id':17}); }//三色同顺 if(sansetongke)ans.fans.push({'val':2,'id':19});//三色同刻 if(gangzi==3)ans.fans.push({'val':2,'id':20});//三杠子 if(kezi==4)ans.fans.push({'val':2,'id':21});//对对和 if(anke==3)ans.fans.push({'val':2,'id':22});//三暗刻 if(typecnt[32][1]+typecnt[33][1]+typecnt[34][1]==5)ans.fans.push({'val':2,'id':23});//小三元 if(flag[4]==true)ans.fans.push({'val':2,'id':24});//混老头 if(duizi==7)ans.fans.push({'val':2,'id':25});//七对子 if(is_guyi()&&wumenqi)ans.fans.push({'val':2,'id':54});//五门齐 if(is_guyi()&&sanlianke)ans.fans.push({'val':2,'id':55});//三连刻 if(chunquandai){ if(fulucnt==0)ans.fans.push({'val':3,'id':26}); else ans.fans.push({'val':2,'id':26}); }//纯全带幺九 if(hunyise&&!qingyise){ if(fulucnt==0)ans.fans.push({'val':3,'id':27}); else ans.fans.push({'val':2,'id':27}); }//混一色 if(is_guyi()&&santongshun){ ans=deletefan(ans,13); if(fulucnt==0)ans.fans.push({'val':3,'id':56}); else ans.fans.push({'val':2,'id':56}); }//一色三同顺 if(beikou==2&&fulucnt==0)ans.fans.push({'val':3,'id':28});//两杯口 if(qingyise){ if(fulucnt==0)ans.fans.push({'val':6,'id':29}); else ans.fans.push({'val':5,'id':29}); }//清一色 if(is_guyi()==2){ if(zimo&&paishan.length/2-14==0&&lstdrawtype==1&&lsttile=="1p"){ ans=deletefan(ans,5); ans.fans.push({'val':5,'id':57});//一筒摸月 } if(!zimo&&paishan.length/2-14==0&&lsttile=="9p"){ ans=deletefan(ans,6); ans.fans.push({'val':5,'id':58});//九筒捞鱼 } } if(calcsudian(ans)==-2000)return ans; if(alldoras[0]!=0)ans.fans.push({'val':alldoras[0],'id':31});//宝牌 if(alldoras[1]!=0)ans.fans.push({'val':alldoras[1],'id':32});//红宝牌 if(alldoras[2]!=0)ans.fans.push({'val':alldoras[2],'id':34});//北宝牌 if(liqiinfo[seat].liqi!=0)ans.fans.push({'val':alldoras[3],'id':33});//里宝牌 //-------------------------------------------------- if(duizi==7){ ans.fu=25; return ans; }//七对子固定符数 ans.fu=20;//符底 if(!pinghu)ans.fu+=tingpaifu;//听牌型符 for(let i=1;i<=34;i++){ if(i==1||i==9||i==10||i==18||i==19||i==27||i>=28&&i<=34){ if(typecnt[i][0]==1)ans.fu+=4; if(typecnt[i][0]==2)ans.fu+=16; if(typecnt[i][0]==3)ans.fu+=32; if(typecnt[i][0]==6)ans.fu+=8; } else{ if(typecnt[i][0]==1)ans.fu+=2; if(typecnt[i][0]==2)ans.fu+=8; if(typecnt[i][0]==3)ans.fu+=16; if(typecnt[i][0]==6)ans.fu+=4; } if(typecnt[i][0]==7){ if(i==tiletoint(((seat-ju+playercnt)%playercnt+1).toString()+"z"))ans.fu+=2; if(i==tiletoint((chang+1).toString()+"z"))ans.fu+=2; if(i==32||i==33||i==34)ans.fu+=2; } }//刻子符 if(zimo&&!pinghu)ans.fu+=2;//自摸符 if(!zimo&&fulucnt==0)ans.fu+=10;//门前清荣和符 ans.fu=Math.ceil(ans.fu/10)*10; if(ans.fan==1&&ans.fu==20)ans.fu=30; //-------------------------------------------------- return ans; } for(let i=partitiontmp.length-1;i>=0;i--){ let tile=partitiontmp[i].tile,type=partitiontmp[i].type; if(type==5&&(equaltile(tile[0],lsttile)||equaltile(tile[1],lsttile)||equaltile(tile[2],lsttile))){ if(!zimo)partitiontmp[i].type=0; let midtile=inttotile((tiletoint(tile[0])+tiletoint(tile[1])+tiletoint(tile[2]))/3); if(equaltile(midtile,lsttile))updateret(calc0(2));//坎张听符 else if(tiletoint(lsttile)%9==3&&tiletoint(midtile)%9==2)updateret(calc0(2));//边张听符 else if(tiletoint(lsttile)%9==7&&tiletoint(midtile)%9==8)updateret(calc0(2));//边张听符 else updateret(calc0(0)); partitiontmp[i].type=5; } if(type==6&&equaltile(tile[0],lsttile)){ if(!zimo)partitiontmp[i].type=1; updateret(calc0(0)); partitiontmp[i].type=6; } if(type==7&&equaltile(tile[0],lsttile))updateret(calc0(2));//单骑符 } } function dfs(now){ if(now==35){ if(partition.length==7||partition.length==5)calc(); return; } if(cnt[now]==0){ dfs(now+1); return; } let whatever=[0,2,3]; for(let k=0;k<3;k++){ if(cnt[now]=cnt0&&cnt[nxt2[nxt2[now]]]>=cnt0){ cnt[now]-=cnt0; cnt[nxt2[now]]-=cnt0; cnt[nxt2[nxt2[now]]]-=cnt0; for(let i=1;i<=cnt0;i++)partition.push({'type':5,'tile':[inttotile(now),inttotile(nxt2[now]),inttotile(nxt2[nxt2[now]])]}); dfs(now+1); cnt[now]+=cnt0; cnt[nxt2[now]]+=cnt0; cnt[nxt2[nxt2[now]]]+=cnt0; for(let i=1;i<=cnt0;i++)partition.length=partition.length-1; } if(k==1||k==2)partition.length=partition.length-1; cnt[now]+=whatever[k]; } } dfs(1); if(calchupai(tls)==3){ let tianhu=false; let ans={'yiman':true,'fans':[],'fu':0}; if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat==ju&&zimo){ans.fans.push({'val':1,'id':35});tianhu=true;}//天和 if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat!=ju&&zimo)ans.fans.push({'val':1,'id':36});//地和 if(liqiinfo[seat].yifa!=0&&liqiinfo[seat].liqi==0&&seat!=ju&&!zimo&&is_guyi())ans.fans.push({'val':1,'id':59});//人和 if(fulucnt==0&&cnt[tiletoint(lsttile)]==1&&!tianhu)ans.fans.push({'val':1,'id':42});//国士无双 if(fulucnt==0&&(cnt[tiletoint(lsttile)]==2||tianhu))ans.fans.push({'val':2,'id':49});//国士无双十三面 updateret(ans); } return ret; } function calcxun(){ for(let x=0;x=13)title_id=11; if(points.yiman==true)title_id=val+4; //------------------------------------------- let sudian=calcsudian(points); let zhahu=false; if(calchupai(playertiles[seat])==0||sudian==-2000)zhahu=true; if(calchupai(playertiles[seat])!=3&&lstaction.name=="RecordAnGangAddGang"&&lstaction.data.type==3)zhahu=true; let point_rong=0,point_sum=0,point_zimo_qin=0,point_zimo_xian=0; if(qinjia){ point_rong=6*sudian; point_zimo_qin=2*sudian;//not needed point_zimo_xian=2*sudian; if(playercnt==3&&have_zimosun()==false)point_zimo_xian=3*sudian; if(playercnt==3&&have_zimosun())point_sum=4*sudian; else point_sum=6*sudian; } else{ point_rong=4*sudian; point_zimo_qin=2*sudian; point_zimo_xian=sudian; if(playercnt==3&&have_zimosun()==false){ point_zimo_qin=sudian*5/2; point_zimo_xian=sudian*3/2; } if(playercnt==3&&have_zimosun())point_sum=3*sudian; else point_sum=4*sudian; } point_rong=qieshang(point_rong); point_sum=qieshang(point_sum); point_zimo_qin=qieshang(point_zimo_qin); point_zimo_xian=qieshang(point_zimo_xian); if(zhahu){ if(qinjia){ point_rong=12000; point_zimo_qin=4000;//not needed point_zimo_xian=4000; if(playercnt==3)point_sum=8000; else point_sum=12000; } else{ point_rong=8000; point_zimo_qin=4000; point_zimo_xian=2000; if(playercnt==3)point_sum=6000; else point_sum=8000; } for(let i=0;i=0;i--){ chuanmagangs.over.push(chuanmagangs.notover[i]); delta_scores[chuanmagangs.notover[i].from]-=chuanmagangs.notover[i].val; delta_scores[chuanmagangs.notover[i].to]+=chuanmagangs.notover[i].val; chuanmagangs.notover.length--; } ret.delta_scores=[].concat(delta_scores); for(let i=0;i=1000){ liqibang=liqibang+1; scores[lstliqi.seat]=scores[lstliqi.seat]-1000; liqiinfo[lstliqi.seat]={'liqi':lstliqi.type,'yifa':1,'kai':lstliqi.kai}; liqi={ 'liqibang':liqibang, 'score':scores[lstliqi.seat], 'seat':lstliqi.seat } } lstliqi=0; let tile_state; if(is_openhand(seat)||liqiinfo[seat].kai)tile_state=1; if(drawtype==1){ if(!is_chuanma())addDealTile(calcdoras(),paishan.length/2-15,seat,paishan.substring(0,2),liqi,tile_state); else addDealTile(calcdoras(),paishan.length/2-1,seat,paishan.substring(0,2),liqi,tile_state); drawcard=paishan.substring(0,2); paishan=paishan.substring(2); lstdrawtype=1; } else{ addDealTile(calcdoras(),paishan.length/2-15,seat,paishan.substring(paishan.length-2),liqi,tile_state); drawcard=paishan.substring(paishan.length-2); paishan=paishan.substring(0,paishan.length-2); lstdrawtype=0; } drawtype=1; saveproject(); return drawcard; }catch(e){ throw(e); loadproject(lstscene); } } function qiepai(seat,kind,is_liqi){ try{ if(typeof(seat)=="boolean"||seat=="liqi"||seat=="kailiqi"){kind=seat;seat=undefined;} if(typeof(kind)=="boolean"||kind=="liqi"||kind=="kailiqi"){is_liqi=kind;kind=undefined;} if(seat!=0&&seat!=1&&seat!=2&&seat!=playercnt-1&&seat!=undefined){kind=seat;seat=undefined;} if(seat==undefined){ let lstaction=getlstaction(); if(lstaction.name=="RecordNewRound"||lstaction.name=="RecordChangeTile"||lstaction.name=="RecordSelectGap")seat=ju; else seat=lstaction.data.seat; } if(kind==undefined){ if(discardtiles[seat].length!=0){ kind=discardtiles[seat].substring(0,2); discardtiles[seat]=discardtiles[seat].substring(2); if(kind==".."||kind==" ")kind="moqie"; } else kind="moqie"; } if(is_liqi==true)is_liqi="liqi"; if(is_liqi==undefined)is_liqi=false; let is_wliqi=false,is_kailiqi=false; if(is_liqi!=false&&liqiinfo[seat].yifa!=0)is_wliqi=true; if(is_liqi=="liqi"){is_liqi=true;} else if(is_liqi=="kailiqi"){is_liqi=true;is_kailiqi=true;} if(is_wliqi)lstliqi={'seat':seat,'type':2,'kai':0}; else if(is_liqi!=false)lstliqi={'seat':seat,'type':1,'kai':0}; if(is_kailiqi)lstliqi.kai=1; if(doracnt.lsttype==1){ doracnt.lsttype=0; doracnt.cnt++; } let flag=0,tile; if(kind=="moqie")flag=2; else if(typeof(kind)=="string")kind=[kind]; function swap(x){ playertiles[seat][x]=playertiles[seat][playertiles[seat].length-1]; playertiles[seat][playertiles[seat].length-1]=tile; if(x==playertiles[seat].length-1)flag=2; else flag=1; } function intiles(x,tile){ let cnt=[]; for(let i=1;i<=37;i++)cnt[i]=0; for(let i=0;i=1)return true; else return false; } for(let i=playertiles[seat].length-1;i>=0;i--){ tile=playertiles[seat][i]; if(intiles(kind,tile)){swap(i);break;} } let lstactionname=getlstaction().name; let tile_state; if(is_openhand(seat))tile_state=1; if(flag==0&&kind[0]>='0'&&kind[0]<='9'){ if(is_peipaimingpai()){tile_state=erasemingpai(kind,seat);} paihe[seat].tiles.push(kind); let abc=tiletoint(kind); if(abc!=1&&abc!=9&&abc!=10&&abc!=18&&abc!=19&&abc!=27&&abc<=27)paihe[seat].liujumanguan=false; liqiinfo[seat].yifa=0; if(playertiles[seat][playertiles[seat].length-1]==kind&&lstactionname!="RecordNewRound"&&lstactionname!="RecordChiPengGang")addDiscardTile(is_liqi,is_wliqi,calcdoras(),true,seat,kind,tingpai(seat),tile_state); else addDiscardTile(is_liqi,is_wliqi,calcdoras(),false,seat,kind,tingpai(seat),tile_state,is_kailiqi); saveproject(); return 1; } if(flag==1||lstactionname=="RecordNewRound"||lstactionname=="RecordChiPengGang"){ let tile=playertiles[seat][playertiles[seat].length-1]; if(is_peipaimingpai()){tile_state=erasemingpai(tile,seat);} paihe[seat].tiles.push(tile); let abc=tiletoint(tile); if(abc!=1&&abc!=9&&abc!=10&&abc!=18&&abc!=19&&abc!=27&&abc<=27)paihe[seat].liujumanguan=false; liqiinfo[seat].yifa=0; addDiscardTile(is_liqi,is_wliqi,calcdoras(),false,seat,tile,tingpai(seat),tile_state,is_kailiqi); saveproject(); return 1; } else if(flag==2&&lstactionname!="RecordNewRound"&&lstactionname!="RecordChiPengGang"){ let tile=playertiles[seat][playertiles[seat].length-1]; if(is_peipaimingpai()){tile_state=erasemingpai(tile,seat);} paihe[seat].tiles.push(tile); let abc=tiletoint(tile); if(abc!=1&&abc!=9&&abc!=10&&abc!=18&&abc!=19&&abc!=27&&abc<=27)paihe[seat].liujumanguan=false; liqiinfo[seat].yifa=0; addDiscardTile(is_liqi,is_wliqi,calcdoras(),true,seat,tile,tingpai(seat),tile_state,is_kailiqi); saveproject(); return 1; } else return 0; }catch(e){ throw(e); loadproject(lstscene); } } function mingpai(seat,tiles){ try{ function changedora(x){ if(x[0]=='0')return "5"+x[1]; if(x[0]=='5'&&x[1]!='z')return "0"+x[1]; return x; } function intiles(x,y){ let cnt=[],cnt2=[]; for(let i=1;i<=37;i++)cnt[i]=cnt2[i]=0; for(let i=0;icnt2[i])return false; return true; } function trying(x,seat){ for(let seat2=0;seat2=3)seat=seat2; if(tiles.length==2&&cnt[tiletoint(tiles[0])]>=2)seat=seat2; } } } if(typeof(tiles)=="string")tiles=separatetile(tiles); if(tiles==undefined){ let lsttile=getlstaction().data.tile; lsttile=inttotile(tiletoint(lsttile)); if(trying([lsttile,lsttile,lsttile],seat))return; if(lsttile[0]=='5'&&lsttile[1]!='z'){ if(trying(["0"+lsttile[1],lsttile,lsttile],seat))return; if(trying(["0"+lsttile[1],"0"+lsttile[1],lsttile],seat))return; } if(trying([lsttile,lsttile],seat))return; if(lsttile[0]=='5'&&lsttile[1]!='z'){ if(trying(["0"+lsttile[1],lsttile],seat))return; if(trying(["0"+lsttile[1],"0"+lsttile[1]],seat))return; } seat=(getlstaction().data.seat+1)%playercnt; if(lsttile[1]!='z'&&lsttile[0]!='1'&&lsttile[0]!='2'){ if(trying([inttotile(tiletoint(lsttile)-2),inttotile(tiletoint(lsttile)-1)],seat))return; if(trying([changedora(inttotile(tiletoint(lsttile)-2)),inttotile(tiletoint(lsttile)-1)],seat))return; if(trying([inttotile(tiletoint(lsttile)-2),changedora(inttotile(tiletoint(lsttile)-1))],seat))return; } if(lsttile[1]!='z'&&lsttile[0]!='1'&&lsttile[0]!='9'){ if(trying([inttotile(tiletoint(lsttile)-1),inttotile(tiletoint(lsttile)+1)],seat))return; if(trying([changedora(inttotile(tiletoint(lsttile)-1)),inttotile(tiletoint(lsttile)+1)],seat))return; if(trying([inttotile(tiletoint(lsttile)-1),changedora(inttotile(tiletoint(lsttile)+1))],seat))return; } if(lsttile[1]!='z'&&lsttile[0]!='8'&&lsttile[0]!='9'){ if(trying([inttotile(tiletoint(lsttile)+1),inttotile(tiletoint(lsttile)+2)],seat))return; if(trying([changedora(inttotile(tiletoint(lsttile)+1)),inttotile(tiletoint(lsttile)+2)],seat))return; if(trying([inttotile(tiletoint(lsttile)+1),changedora(inttotile(tiletoint(lsttile)+2))],seat))return; } return; } for(let i=0;i=1000){ liqibang=liqibang+1; scores[lstliqi.seat]=scores[lstliqi.seat]-1000; liqiinfo[lstliqi.seat]={'liqi':lstliqi.type,'yifa':1,'kai':lstliqi.kai}; liqi={ 'liqibang':liqibang, 'score':scores[lstliqi.seat], 'seat':lstliqi.seat } } lstliqi=0; let tile_states=[]; if(is_peipaimingpai())for(let i=0;i=1&&tile=="4z"&&(type==undefined||type=="babei")){ if(is_peipaimingpai())tile_states.push(erasemingpai(tile,seat)); for(let i=0;i=4&&(type==undefined||type=="angang")){ for(let i=0;i=1&&(type==undefined||type=="jiagang")){ for(let i=0;i=1)yaojiutype++;if(cnt[9]>=1)yaojiutype++; if(cnt[10]>=1)yaojiutype++;if(cnt[18]>=1)yaojiutype++; if(cnt[19]>=1)yaojiutype++;if(cnt[27]>=1)yaojiutype++; if(cnt[28]>=1)yaojiutype++;if(cnt[29]>=1)yaojiutype++; if(cnt[30]>=1)yaojiutype++;if(cnt[31]>=1)yaojiutype++; if(cnt[32]>=1)yaojiutype++;if(cnt[33]>=1)yaojiutype++; if(cnt[34]>=1)yaojiutype++; if(yaojiutype>=9&&liqiinfo[seat].liqi==0&&liqiinfo[seat].yifa==1&&playertiles[seat].length==14){ let lsttile=playertiles[seat][playertiles[seat].length-1]; playertiles[seat].length=playertiles[seat].length-1; playertiles[seat].sort(cmp); playertiles[seat].push(lsttile); if(ret==undefined)ret={ 'name':"RecordLiuJu", 'data':{ 'seat':seat, 'tiles':[].concat(playertiles[seat]), 'type':1 } }; } } if(playercnt==4&&paihe[0].tiles.length==1&&paihe[1].tiles.length==1&&paihe[2].tiles.length==1&&paihe[3].tiles.length==1&&paihe[0].tiles[0]==paihe[1].tiles[0]&&paihe[1].tiles[0]==paihe[2].tiles[0]&&paihe[2].tiles[0]==paihe[3].tiles[0]&&tiletoint(paihe[0].tiles[0])>=28&&tiletoint(paihe[0].tiles[0])<=31){ if(ret==undefined)ret={ 'name':"RecordLiuJu", 'data':{ 'type':2 } }; } let havegang=[0,0,0,0],havegangcnt=0; for(let seat=0;seat=2){ if(ret==undefined)ret={ 'name':"RecordLiuJu", 'data':{ 'type':3 } }; } if(playercnt==4&&ret==undefined){ let liqiplayercnt=0; if(liqiinfo[0].liqi!=0)liqiplayercnt++; if(liqiinfo[1].liqi!=0)liqiplayercnt++; if(liqiinfo[2].liqi!=0)liqiplayercnt++; if(liqiinfo[3].liqi!=0)liqiplayercnt++; if(liqiplayercnt==3&&lstliqi!=0&&scores[lstliqi.seat]>=1000){ liqibang=liqibang+1; scores[lstliqi.seat]=scores[lstliqi.seat]-1000; liqiinfo[lstliqi.seat]={'liqi':lstliqi.type,'yifa':1,'kai':lstliqi.kai}; let allplayertiles=["","","",""]; for(let seat=0;seatx.part_point_1)return 1; if(y.part_point_1x.seat)return -1; } players=[]; for(let i=0;i