"use strict"; game.import("mode", function (lib, game, ui, get, ai, _status) { return { name: "doudizhu", start: function () { "step 0"; var playback = localStorage.getItem(lib.configprefix + "playback"); if (playback) { ui.create.me(); ui.arena.style.display = "none"; ui.system.style.display = "none"; _status.playback = playback; localStorage.removeItem(lib.configprefix + "playback"); var store = lib.db.transaction(["video"], "readwrite").objectStore("video"); store.get(parseInt(playback)).onsuccess = function (e) { if (e.target.result) { game.playVideoContent(e.target.result.video); } else { alert("播放失败:找不到录像"); game.reload(); } }; event.finish(); } else if (!_status.connectMode) { game.prepareArena(3); } "step 1"; event.replacePile = function () { var map = { shuiyanqijunx: "shuiyanqijuny", bingliang: "binglinchengxia", fangtian: "toushiche", wutiesuolian: "toushiche", }; for (var i = 0; i < lib.card.list.length; i++) { var name = lib.card.list[i][2]; if (map[name]) { lib.card.list[i][2] = map[name]; lib.card.list[i][4] = null; lib.card.list[i]._replaced = true; } else if (name == "lebu") { switch (lib.card.list[i][0]) { case "spade": lib.card.list[i][2] = "shuiyanqijuny"; break; case "club": lib.card.list[i][2] = "luojingxiashi"; break; default: lib.card.list[i][2] = "baiyidujiang"; break; } lib.card.list[i]._replaced = true; } } }; _status.mode = get.config("doudizhu_mode"); if (_status.connectMode) { _status.mode = lib.configOL.doudizhu_mode; game.waitForPlayer(function () { lib.configOL.number = 3; }); } else if (_status.mode == "binglin") { event.replacePile(); } else if (_status.mode == "online") { lib.card.list = lib.online_cardPile.slice(0); lib.inpile.addArray(["nanman", "wanjian", "taoyuan", "wugu"]); game.fixedPile = true; } "step 2"; if (_status.connectMode) { if (_status.mode == "online") { lib.card.list = lib.online_cardPile.slice(0); lib.inpile.addArray(["nanman", "wanjian", "taoyuan", "wugu"]); game.fixedPile = true; } else if (_status.mode == "binglin") event.replacePile(); if (lib.configOL.number < 3) { lib.configOL.number = 3; } game.randomMapOL(); } else { for (var i = 0; i < game.players.length; i++) { game.players[i].getId(); } game.chooseCharacter(); } "step 3"; if (ui.coin) { _status.coinCoeff = get.coinCoeff([game.me.name]); } game.showIdentity(true); var map = {}; for (var i in lib.playerOL) { map[i] = lib.playerOL[i].identity; } game.broadcast(function (map) { for (var i in map) { lib.playerOL[i].identity = map[i]; lib.playerOL[i].setIdentity(); lib.playerOL[i].ai.shown = 1; } }, map); switch (_status.mode) { case "online": game.addGlobalSkill("online_juzhong"); game.addGlobalSkill("online_zhadan_button"); game.addGlobalSkill("online_zhadan"); game.addGlobalSkill("online_aozhan"); game.addGlobalSkill("online_gongshoujintui"); break; case "binglin": game.addGlobalSkill("binglin_bingjin"); break; default: if (!game.zhu.isInitFilter("noZhuSkill")) { game.zhu.addSkill("feiyang"); game.zhu.addSkill("bahu"); } } game.syncState(); event.trigger("gameStart"); var players = get.players(lib.sort.position); var info = []; for (var i = 0; i < players.length; i++) { info.push({ name: players[i].name1, name2: players[i].name2, identity: players[i].identity, }); } _status.videoInited = true; game.addVideo("init", null, info); if (_status.mode == "kaihei") game.addGlobalSkill("kaihei"); var next = game.gameDraw(game.zhu || _status.firstAct || game.me); if (_status.mode == "online") { game.zhu.$equip(game.createCard("diqi", "club", 13)); next.num = function (player) { var num = 4; if (player == game.zhu) { if (lib.character[player.name1] && get.infoHp(lib.character[player.name1][2]) > 3) num++; if (lib.character[player.name2] && get.infoHp(lib.character[player.name2][2]) > 3) num++; } return num; }; } else if (_status.mode == "binglin") { next.num = function (player) { return player == game.zhu ? 5 : 4; }; } if (_status.mode != "online" && _status.connectMode && lib.configOL.change_card) game.replaceHandcards(game.players.slice(0)); game.phaseLoop(game.zhu || _status.firstAct || game.me); game.zhu.showGiveup(); }, game: { canReplaceViewpoint: () => true, recommendDizhu: [ "re_guojia", "re_huanggai", "re_lvbu", "re_guanyu", "re_sunquan", "re_xusheng", "re_wuyi", "re_sunben", "xuyou", "zhangchunhua", "caochong", "zhangsong", "zhongyao", "wangyi", "caochun", "maliang", "sp_diaochan", "quyi", "sp_zhaoyun", "shamoke", "lijue", "liuzan", "wenyang", "shen_lvmeng", "shen_ganning", "jiakui", "wangyuanji", "lingcao", "miheng", "sp_key_yuri", "key_hinata", "key_rin", "key_kyousuke", "ns_chendao", "jiakui", "haozhao", ], addRecord: function (bool) { if (typeof bool == "boolean") { var data = lib.config.gameRecord.doudizhu.data; var identity = game.me.identity; if (!data[identity]) { data[identity] = [0, 0]; } if (bool) { data[identity][0]++; } else { data[identity][1]++; } var list = ["zhu", "fan"]; var str = ""; for (var i = 0; i < list.length; i++) { if (data[list[i]]) { str += lib.translate[list[i] + "2"] + ":" + data[list[i]][0] + "胜" + " " + data[list[i]][1] + "负
"; } } lib.config.gameRecord.doudizhu.str = str; game.saveConfig("gameRecord", lib.config.gameRecord); } }, getState: function () { var state = {}; for (var i in lib.playerOL) { var player = lib.playerOL[i]; state[i] = { identity: player.identity }; } return state; }, updateState: function (state) { for (var i in state) { var player = lib.playerOL[i]; if (player) { player.identity = state[i].identity; } } }, updateRoundNumber: function () { if (_status.mode == "online") { game.broadcastAll( function (num1, num2, top, bonusNum) { if (ui.cardPileNumber) { var str = num1 + "轮 公共牌堆: " + num2; if ( game.me && game.me.storage.doudizhu_cardPile && game.me.storage.doudizhu_cardPile.length ) str += " 个人牌堆: " + game.me.storage.doudizhu_cardPile.length; if (bonusNum) str += "
本场叫价: " + bonusNum * 100; ui.cardPileNumber.innerHTML = str; } _status.pileTop = top; }, game.roundNumber, ui.cardPile.childNodes.length, ui.cardPile.firstChild, game.bonusNum ); return; } game.broadcastAll( function (num1, num2, top) { if (ui.cardPileNumber) ui.cardPileNumber.innerHTML = num1 + "轮 剩余牌: " + num2; _status.pileTop = top; }, game.roundNumber, ui.cardPile.childNodes.length, ui.cardPile.firstChild ); }, getRoomInfo: function (uiintro) { uiintro.add( '
双将模式:' + (lib.configOL.double_character ? "开启" : "关闭") ); // uiintro.add('
屏蔽弱将:'+(lib.configOL.ban_weak?'开启':'关闭')); // var last=uiintro.add('
屏蔽强将:'+(lib.configOL.ban_strong?'开启':'关闭')); if (lib.configOL.banned.length) { uiintro.add('
禁用武将:' + get.translation(lib.configOL.banned)); } if (lib.configOL.bannedcards.length) { uiintro.add( '
禁用卡牌:' + get.translation(lib.configOL.bannedcards) ); } uiintro.style.paddingBottom = "8px"; }, getVideoName: function () { var str = get.translation(game.me.name); if (game.me.name2) { str += "/" + get.translation(game.me.name2); } var namex; switch (_status.mode) { case "normal": namex = "休闲斗地主"; break; case "kaihei": namex = "开黑斗地主"; break; case "huanle": namex = "欢乐斗地主"; break; case "binglin": namex = "兵临城下"; break; case "online": namex = "智斗三国"; break; } var name = [str, namex + " - " + lib.translate[game.me.identity + "2"]]; return name; }, showIdentity: function (me) { for (var i = 0; i < game.players.length; i++) { // if(me===false&&game.players[i]==game.me) continue; game.players[i].node.identity.classList.remove("guessing"); game.players[i].identityShown = true; game.players[i].ai.shown = 1; game.players[i].setIdentity(game.players[i].identity); if (game.players[i].identity == "zhu") { game.players[i].isZhu = true; } } if (_status.clickingidentity) { for (var i = 0; i < _status.clickingidentity[1].length; i++) { _status.clickingidentity[1][i].delete(); _status.clickingidentity[1][i].style.transform = ""; } delete _status.clickingidentity; } }, checkResult: function () { var me = game.me._trueMe || game.me; if (game.zhu.isAlive()) { if ( _status.mode != "online" && (_status.mode != "binglin" || game.roundNumber < 3) && game.players.length > 1 ) return; if (me == game.zhu) { game.over(true); } else { game.over(false); } } else { if (me == game.zhu) { game.over(false); } else { game.over(true); } } }, checkOnlineResult: function (player) { if (game.zhu.isAlive()) { return player.identity == "zhu"; } else return player.identity == "fan"; }, chooseCharacterZhidou: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; game.no_continue_game = true; lib.init.onfree(); "step 1"; ui.arena.classList.add("choose-character"); var i; var groups = []; event.list = []; event.map = {}; var chara = get.config("character_online") || lib.characterOnline; for (i in chara) { var list = chara[i]; for (var j = 0; j < list.length; j++) { if ( !lib.character[list[j]] || (i == "key" && lib.filter.characterDisabled(list[j])) ) list.splice(j--, 1); } if (list.length >= 3) { groups.push(i); event.list.addArray(list); } } event.list.randomSort(); _status.characterlist = event.list.slice(0); event.controls = ["不叫地主", "一倍", "两倍", "三倍"]; for (var player of game.players) { var id = player.playerid; player._group = groups.randomRemove(1)[0]; event.map[id] = chara[player._group].randomGets(4); player.storage.doudizhu_cardPile = get.cards(20).sort(function (a, b) { if (a.name != b.name) return lib.sort.card(a.name, b.name); else if (a.suit != b.suit) return lib.suit.indexOf(a) - lib.suit.indexOf(b); else return a.number - b.number; }); } event.dialog = ui.create.dialog( "你的选将框与底牌", [event.map[game.me.playerid], "character"], game.me.storage.doudizhu_cardPile ); event.start = game.players.randomGet(); event.current = event.start; game.delay(7); "step 2"; event.current.classList.add("glow_phase"); if (event.current == game.me) event.dialog.content.firstChild.innerHTML = "是否叫地主?"; else { event.dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主"; game.delay(2); } event.current.chooseControl(event.controls).set("ai", function () { return _status.event.getParent().controls.randomGet(); }); "step 3"; event.current.classList.remove("glow_phase"); event.current._control = result.control; event.current.chat(result.control); if (result.control == "三倍") { game.bonusNum = 3; game.zhu = event.current; return; } else if (result.control != "不叫地主") { event.controls.splice(1, event.controls.indexOf(result.control)); event.tempDizhu = event.current; if (result.control == "二倍") game.bonusNum = 2; } event.current = event.current.next; if ( event.current == event.start && (event.start == event.tempDizhu || event.start._control == "不叫地主") ) { game.zhu = event.tempDizhu || event.start.previous; } else if (event.current == event.start.next && event.current._control) { game.zhu = event.tempDizhu; } else event.goto(2); if (event.current == event.start.previous && !event.tempDizhu) event.controls.remove("不叫地主"); "step 4"; game.updateRoundNumber(); for (var player of game.players) { player.identity = player == game.zhu ? "zhu" : "fan"; player.showIdentity(); } event.dialog.content.firstChild.innerHTML = "请选择" + get.cnNumber(game.me == game.zhu ? 2 : 1) + "张武将牌"; game.me .chooseButton(event.dialog, true, game.me == game.zhu ? 2 : 1) .set("filterButton", function (button) { return typeof button.link == "string"; }); "step 5"; game.me.init(result.links[0], result.links[1]); for (var player of game.players) { if (player != game.me) { if (player == game.zhu) { var list = event.map[player.playerid].randomGets(2); player.init(list[0], list[1]); } else player.init(event.map[player.playerid].randomGet()); } player.markSkill("doudizhu_cardPile"); } game.zhu.hp = 4; game.zhu.maxHp = 4; game.zhu.update(); for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterBinglin: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; game.no_continue_game = true; lib.init.onfree(); "step 1"; ui.arena.classList.add("choose-character"); game.zhuSkill = "zhuSkill_" + ["xiangyang", "jiangling", "fancheng"].randomGet(); var i; event.list = []; event.map = {}; for (i in lib.character) { if (lib.filter.characterDisabled(i)) continue; event.list.push(i); } event.list.randomSort(); _status.characterlist = event.list.slice(0); for (var player of game.players) { event.map[player.playerid] = event.list.randomRemove(4); } event.controls = ["不叫地主", "一倍", "两倍", "三倍"]; event.dialog = ui.create.dialog("本局城池:" + get.translation(game.zhuSkill), [ event.map[game.me.playerid], "character", ]); event.start = game.players.randomGet(); event.current = event.start; game.delay(8); "step 2"; event.current.classList.add("glow_phase"); if (event.current == game.me) event.dialog.content.firstChild.innerHTML = "是否叫地主?"; else { event.dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主"; game.delay(2); } event.current.chooseControl(event.controls).set("ai", function () { return _status.event.getParent().controls.randomGet(); }); "step 3"; event.current.classList.remove("glow_phase"); event.current._control = result.control; event.current.chat(result.control); if (result.control == "三倍") { game.bonusNum = 3; game.zhu = event.current; return; } else if (result.control != "不叫地主") { event.controls.splice(1, event.controls.indexOf(result.control)); event.tempDizhu = event.current; if (result.control == "二倍") game.bonusNum = 2; } event.current = event.current.next; if (event.current == event.start) { game.zhu = event.tempDizhu || event.start.previous; } else event.goto(2); if (event.current == event.start.previous && !event.tempDizhu) event.controls.remove("不叫地主"); "step 4"; for (var player of game.players) { player.identity = player == game.zhu ? "zhu" : "fan"; player.showIdentity(); } event.dialog.close(); event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); "step 5"; var list = ["请选择你的武将", [event.map[game.me.playerid], "character"]]; if (game.me.identity == "fan") { var friend = game.findPlayer(function (current) { return current != game.me && current.identity == "fan"; }); list.push('
队友的选将框
'); list.push([event.map[friend.playerid], "character"]); } game.me .chooseButton(list, true) .set("list", event.map[game.me.playerid]) .set("filterButton", function (button) { return _status.event.list.includes(button.link); }); "step 6"; game.me.init(result.links[0]); for (var player of game.players) { if (player != game.me) player.init(event.map[player.playerid].randomGet()); if (player == game.zhu) { player.addSkill(game.zhuSkill); } else player.addSkill("binglin_neihong"); } if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterHuanle: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); game.no_continue_game = true; var i; event.list = []; event.list2 = []; var list4 = []; if (!event.map) event.map = {}; for (i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (lib.filter.characterDisabled(ix[j])) ix.splice(j--, 1); } if (ix.length) { var name = ix.randomGet(); event.list.push(name); if (game.recommendDizhu.includes(name)) event.list2.push(name); list4.addArray(ix); } } for (i in lib.character) { if (list4.includes(i) || lib.filter.characterDisabled(i)) continue; event.list.push(i); if (game.recommendDizhu.includes(i)) event.list2.push(i); } event.list.randomSort(); _status.characterlist = event.list.slice(0); event.controls = ["不叫", "叫地主"]; for (var player of game.players) { var id = player.playerid; if (!event.map[id]) event.map[id] = []; event.map[id].addArray(event.list2.randomRemove(1)); event.list.removeArray(event.map[id]); event.map[id].addArray(event.list.randomRemove(4 - event.map[id].length)); event.list2.removeArray(event.map[id]); } event.dialog = ui.create.dialog("你的选将框", [event.map[game.me.playerid], "character"]); event.start = game.players.randomGet(); event.current = event.start; lib.init.onfree(); game.delay(2.5); "step 1"; event.current.chooseControl(event.controls).set("ai", function () { return Math.random() > 0.5 ? "不叫" : "叫地主"; }); if (event.current == game.me) { event.dialog.content.childNodes[0].innerHTML = "是否抢地主?"; } "step 2"; event.current.chat(result.control); if (result.control == "叫地主" || event.current == event.start.next) { game.zhu = result.control == "叫地主" ? event.current : event.current.next; for (var player of game.players) { player.identity = player == game.zhu ? "zhu" : "fan"; player.showIdentity(); } event.dialog.close(); event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); } else { event.current = event.current.next; event.goto(1); game.delay(1.5); } "step 3"; game.me.chooseButton( ["请选择你的武将", [event.map[game.me.playerid], "character"]], true ); "step 4"; game.me.init(result.links[0]); for (var player of game.players) { if (player != game.me) player.init(event.map[player.playerid].randomGet()); } if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterKaihei: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); game.no_continue_game = true; var i; var identityList = ["zhu", "fan", "fan"]; game.saveConfig("continue_name"); event.list = []; var list4 = []; identityList.randomSort(); for (i = 0; i < game.players.length; i++) { game.players[i].identity = identityList[i]; game.players[i].showIdentity(); if (identityList[i] == "zhu") { game.zhu = game.players[i]; } } if (!game.zhu) game.zhu = game.me; else { game.zhu.setIdentity(); game.zhu.identityShown = true; game.zhu.isZhu = game.zhu.identity == "zhu"; game.zhu.node.identity.classList.remove("guessing"); game.me.setIdentity(); game.me.node.identity.classList.remove("guessing"); } for (i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (lib.filter.characterDisabled(ix[j])) ix.splice(j--, 1); } if (ix.length) { event.list.push(ix.randomGet()); list4.addArray(ix); } } for (i in lib.character) { if (list4.includes(i) || lib.filter.characterDisabled(i)) continue; event.list.push(i); } event.list.randomSort(); _status.characterlist = event.list.slice(0); for (var player of game.players) { player._characterChoice = event.list.randomRemove(player.identity == "zhu" ? 5 : 3); if (player.identity == "fan") player._friend = player.next.identity == "fan" ? player.next : player.previous; } var createDialog = ["选择武将"]; createDialog.push([game.me._characterChoice, "character"]); if (game.me._friend) { createDialog.push("队友的武将"); createDialog.push([game.me._friend._characterChoice, "character"]); } game.me .chooseButton(createDialog, true) .set("onfree", true) .set("filterButton", function (button) { return _status.event.player._characterChoice.includes(button.link); }); "step 1"; game.me.init(result.links[0]); for (var i = 0; i < game.players.length; i++) { if (game.players[i] != game.me) game.players[i].init(game.players[i]._characterChoice.randomGet()); _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); if (game.players[i] == game.zhu) { if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } } } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacter: function () { if (_status.mode == "kaihei") { game.chooseCharacterKaihei(); return; } if (_status.mode == "huanle") { game.chooseCharacterHuanle(); return; } if (_status.mode == "online") { game.chooseCharacterZhidou(); return; } if (_status.mode == "binglin") { game.chooseCharacterBinglin(); return; } var next = game.createEvent("chooseCharacter"); next.showConfig = true; next.addPlayer = function (player) { var list = get.identityList(game.players.length - 1); var list2 = get.identityList(game.players.length); for (var i = 0; i < list.length; i++) list2.remove(list[i]); player.identity = list2[0]; player.setIdentity("cai"); }; next.removePlayer = function () { return game.players.randomGet(game.me, game.zhu); }; next.ai = function (player, list, list2, back) { var listc = list.slice(0, 2); for (var i = 0; i < listc.length; i++) { var listx = lib.characterReplace[listc[i]]; if (listx && listx.length) listc[i] = listx.randomGet(); } if (get.config("double_character")) { player.init(listc[0], listc[1]); } else { player.init(listc[0]); } if (player == game.zhu) { if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } } if (back) { list.remove(get.sourceCharacter(player.name1)); list.remove(get.sourceCharacter(player.name2)); for (var i = 0; i < list.length; i++) { back.push(list[i]); } } if (typeof lib.config.test_game == "string" && player == game.me.next) { player.init(lib.config.test_game); } player.node.name.dataset.nature = get.groupnature(player.group); }; next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); var i; var list; var list4 = []; var identityList = ["zhu", "fan", "fan"]; var chosen = lib.config.continue_name || []; game.saveConfig("continue_name"); event.chosen = chosen; var addSetting = function (dialog) { dialog.add("选择身份").classList.add("add-setting"); var table = document.createElement("div"); table.classList.add("add-setting"); table.style.margin = "0"; table.style.width = "100%"; table.style.position = "relative"; var listi = ["random", "zhu", "fan"]; for (var i = 0; i < listi.length; i++) { var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); td.link = listi[i]; if (td.link === game.me.identity) { td.classList.add("bluebg"); } table.appendChild(td); td.innerHTML = "" + get.translation(listi[i] + "2") + ""; td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { if (_status.dragged) return; if (_status.justdragged) return; _status.tempNoButton = true; setTimeout(function () { _status.tempNoButton = false; }, 500); var link = this.link; if (game.zhu.name) { if (link != "random") { _status.event.parent.fixedseat = get.distance( game.me, game.zhu, "absolute" ); } game.zhu.uninit(); delete game.zhu.isZhu; delete game.zhu.identityShown; } var current = this.parentNode.querySelector(".bluebg"); if (current) { current.classList.remove("bluebg"); } current = seats.querySelector(".bluebg"); if (current) { current.classList.remove("bluebg"); } if (link == "random") { link = ["zhu", "fan"].randomGet(); for (var i = 0; i < this.parentNode.childElementCount; i++) { if (this.parentNode.childNodes[i].link == link) { this.parentNode.childNodes[i].classList.add("bluebg"); } } } else { this.classList.add("bluebg"); } num = get.config("choice_" + link); _status.event.parent.swapnodialog = function (dialog, list) { var buttons = ui.create.div(".buttons"); var node = dialog.buttons[0].parentNode; dialog.buttons = ui.create.buttons(list, "characterx", buttons); dialog.content.insertBefore(buttons, node); buttons.addTempClass("start"); node.remove(); game.uncheck(); game.check(); for (var i = 0; i < seats.childElementCount; i++) { if ( get.distance(game.zhu, game.me, "absolute") === seats.childNodes[i].link ) { seats.childNodes[i].classList.add("bluebg"); } } }; _status.event = _status.event.parent; _status.event.step = 0; _status.event.identity = link; if (link != (event.zhongmode ? "mingzhong" : "zhu")) { seats.previousSibling.style.display = ""; seats.style.display = ""; } else { seats.previousSibling.style.display = "none"; seats.style.display = "none"; } game.resume(); }); } dialog.content.appendChild(table); dialog.add("选择座位").classList.add("add-setting"); var seats = document.createElement("div"); seats.classList.add("add-setting"); seats.style.margin = "0"; seats.style.width = "100%"; seats.style.position = "relative"; for (var i = 2; i <= game.players.length; i++) { var td = ui.create.div(".shadowed.reduce_radius.pointerdiv.tdnode"); td.innerHTML = get.cnNumber(i, true); td.link = i - 1; seats.appendChild(td); if (get.distance(game.zhu, game.me, "absolute") === i - 1) { td.classList.add("bluebg"); } td.addEventListener(lib.config.touchscreen ? "touchend" : "click", function () { if (_status.dragged) return; if (_status.justdragged) return; if (get.distance(game.zhu, game.me, "absolute") == this.link) return; var current = this.parentNode.querySelector(".bluebg"); if (current) { current.classList.remove("bluebg"); } this.classList.add("bluebg"); for (var i = 0; i < game.players.length; i++) { if (get.distance(game.players[i], game.me, "absolute") == this.link) { game.swapSeat(game.zhu, game.players[i], false); return; } } }); } dialog.content.appendChild(seats); if (game.me == game.zhu) { seats.previousSibling.style.display = "none"; seats.style.display = "none"; } dialog.add(ui.create.div(".placeholder.add-setting")); dialog.add(ui.create.div(".placeholder.add-setting")); if (get.is.phoneLayout()) dialog.add(ui.create.div(".placeholder.add-setting")); }; var removeSetting = function () { var dialog = _status.event.dialog; if (dialog) { dialog.style.height = ""; delete dialog._scrollset; var list = Array.from(dialog.querySelectorAll(".add-setting")); while (list.length) { list.shift().remove(); } ui.update(); } }; event.addSetting = addSetting; event.removeSetting = removeSetting; event.list = []; identityList.randomSort(); if (event.identity) { identityList.remove(event.identity); identityList.unshift(event.identity); if (event.fixedseat) { var zhuIdentity = "zhu"; if (zhuIdentity != event.identity) { identityList.remove(zhuIdentity); identityList.splice(event.fixedseat, 0, zhuIdentity); } delete event.fixedseat; } delete event.identity; } for (i = 0; i < game.players.length; i++) { game.players[i].identity = identityList[i]; game.players[i].showIdentity(); if (identityList[i] == "zhu") { game.zhu = game.players[i]; } } if (!game.zhu) game.zhu = game.me; else { game.zhu.setIdentity(); game.zhu.identityShown = true; game.zhu.isZhu = game.zhu.identity == "zhu"; game.zhu.node.identity.classList.remove("guessing"); game.me.setIdentity(); game.me.node.identity.classList.remove("guessing"); } //选将框分配 for (i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (chosen.includes(ix[j]) || lib.filter.characterDisabled(ix[j])) ix.splice(j--, 1); } if (ix.length) { event.list.push(i); list4.addArray(ix); } } for (i in lib.character) { if (chosen.includes(i) || list4.includes(i)) continue; if (lib.filter.characterDisabled(i)) continue; event.list.push(i); list4.push(i); } event.list.randomSort(); _status.characterlist = list4.slice(0); var num = get.config("choice_" + game.me.identity); list = event.list.slice(0, num); delete event.swapnochoose; var dialog; if (event.swapnodialog) { dialog = ui.dialog; event.swapnodialog(dialog, list); delete event.swapnodialog; } else { var str = "选择角色"; if (_status.brawl && _status.brawl.chooseCharacterStr) { str = _status.brawl.chooseCharacterStr; } dialog = ui.create.dialog(str, "hidden", [list, "characterx"]); if (!_status.brawl || !_status.brawl.noAddSetting) { if (get.config("change_identity")) { addSetting(dialog); } } } dialog.setCaption("选择角色"); game.me.setIdentity(); if (!event.chosen.length) { game.me.chooseButton(dialog, true).set("onfree", true).selectButton = function () { return get.config("double_character") ? 2 : 1; }; } else { lib.init.onfree(); } ui.create.cheat = function () { _status.createControl = ui.cheat2; ui.cheat = ui.create.control("更换", function () { if (ui.cheat2 && ui.cheat2.dialog == _status.event.dialog) { return; } if (game.changeCoin) { game.changeCoin(-3); } event.list.randomSort(); list = event.list.slice(0, num); var buttons = ui.create.div(".buttons"); var node = _status.event.dialog.buttons[0].parentNode; _status.event.dialog.buttons = ui.create.buttons(list, "characterx", buttons); _status.event.dialog.content.insertBefore(buttons, node); buttons.addTempClass("start"); node.remove(); game.uncheck(); game.check(); }); delete _status.createControl; }; if (lib.onfree) { lib.onfree.push(function () { event.dialogxx = ui.create.characterDialog("heightset"); if (ui.cheat2) { ui.cheat2.addTempClass("controlpressdownx", 500); ui.cheat2.classList.remove("disabled"); } }); } else { event.dialogxx = ui.create.characterDialog("heightset"); } ui.create.cheat2 = function () { ui.cheat2 = ui.create.control("自由选将", function () { if (this.dialog == _status.event.dialog) { if (game.changeCoin) { game.changeCoin(50); } this.dialog.close(); _status.event.dialog = this.backup; this.backup.open(); delete this.backup; game.uncheck(); game.check(); if (ui.cheat) { ui.cheat.addTempClass("controlpressdownx", 500); ui.cheat.classList.remove("disabled"); } } else { if (game.changeCoin) { game.changeCoin(-10); } this.backup = _status.event.dialog; _status.event.dialog.close(); _status.event.dialog = _status.event.parent.dialogxx; this.dialog = _status.event.dialog; this.dialog.open(); game.uncheck(); game.check(); if (ui.cheat) { ui.cheat.classList.add("disabled"); } } }); if (lib.onfree) { ui.cheat2.classList.add("disabled"); } }; if (!_status.brawl || !_status.brawl.chooseCharacterFixed) { if (!ui.cheat && get.config("change_choice")) ui.create.cheat(); if (!ui.cheat2 && get.config("free_choose")) ui.create.cheat2(); } "step 1"; if (ui.cheat) { ui.cheat.close(); delete ui.cheat; } if (ui.cheat2) { ui.cheat2.close(); delete ui.cheat2; } var chooseGroup = false; if (event.chosen.length) { if (lib.character[event.chosen[0]][1] == "shen") { chooseGroup = true; } } else if (event.modchosen) { if (event.modchosen[0] == "random") event.modchosen[0] = result.buttons[0].link; else event.modchosen[1] = result.buttons[0].link; } else if (result.buttons.length == 2) { event.choosed = [result.buttons[0].link, result.buttons[1].link]; game.addRecentCharacter(result.buttons[0].link, result.buttons[1].link); if (lib.character[event.choosed[0]][1] == "shen") { chooseGroup = true; } } else { event.choosed = [result.buttons[0].link]; if (lib.character[event.choosed[0]][1] == "shen") { chooseGroup = true; } game.addRecentCharacter(result.buttons[0].link); } "step 2"; if (event.chosen.length) { game.me.init(event.chosen[0], event.chosen[1]); } else if (event.modchosen) { game.me.init(event.modchosen[0], event.modchosen[1]); } else if (event.choosed.length == 2) { game.me.init(event.choosed[0], event.choosed[1]); } else { game.me.init(event.choosed[0]); } event.list.remove(get.sourceCharacter(game.me.name1)); event.list.remove(get.sourceCharacter(game.me.name2)); if (game.me == game.zhu) { if (!game.me.isInitFilter("noZhuHp")) { game.me.hp++; game.me.maxHp++; game.me.update(); } } for (var i = 0; i < game.players.length; i++) { if (game.players[i] != game.me) { event.list.randomSort(); event.ai( game.players[i], event.list.splice(0, get.config("choice_" + game.players[i].identity)), null, event.list ); } } "step 3"; for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterKaiheiOL: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); var i; var identityList = ["fan", "fan", "fan"]; var aiList = game.filterPlayer(function (current) { return current != game.me && !current.isOnline(); }); if (aiList.length == 1) { identityList[game.players.indexOf(aiList[0])] = "zhu"; } else { identityList[0] = "zhu"; identityList.randomSort(); } for (i = 0; i < game.players.length; i++) { game.players[i].identity = identityList[i]; game.players[i].showIdentity(); game.players[i].identityShown = true; if (identityList[i] == "zhu") game.zhu = game.players[i]; } event.list = []; var list4 = []; var libCharacter = {}; for (var i = 0; i < lib.configOL.characterPack.length; i++) { var pack = lib.characterPack[lib.configOL.characterPack[i]]; for (var j in pack) { // if(j=='zuoci') continue; if (lib.character[j]) libCharacter[j] = pack[j]; } } for (i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (!libCharacter[ix[j]] || lib.filter.characterDisabled(ix[j], libCharacter)) ix.splice(j--, 1); } if (ix.length) { event.list.push(ix.randomGet()); list4.addArray(ix); } } for (i in libCharacter) { if (list4.includes(i) || lib.filter.characterDisabled(i, libCharacter)) continue; event.list.push(i); } _status.characterlist = event.list.slice(0); var map = {}; for (var player of game.players) { player._characterChoice = event.list.randomRemove(player.identity == "zhu" ? 5 : 3); if (player.identity == "fan") player._friend = player.next.identity == "fan" ? player.next : player.previous; map[player.playerid] = player._characterChoice; } game.broadcastAll(function (map) { for (var i in map) { lib.playerOL[i]._characterChoice = map[i]; } }, map); "step 1"; var list = []; for (var i = 0; i < game.players.length; i++) { var dialog = ["请选择武将", [game.players[i]._characterChoice, "character"]]; if (game.players[i]._friend) { dialog.push("队友的武将"); dialog.push([game.players[i]._friend._characterChoice, "character"]); } list.push([ game.players[i], dialog, true, function () { return Math.random(); }, function (button) { return _status.event.player._characterChoice.includes(button.link); }, ]); } game.me.chooseButtonOL(list, function (player, result) { if (game.online || player == game.me) player.init(result.links[0]); }); "step 2"; for (var i in lib.playerOL) { if (!result[i] || result[i] == "ai" || !result[i].links || !result[i].links.length) { result[i] = lib.playerOL[i]._characterChoice.randomGet(); } else { result[i] = result[i].links[0]; } if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i]); } } if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } game.broadcast( function (result, zhu) { for (var i in result) { if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i]); } } game.zhu = zhu; if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }, result, game.zhu ); for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterHuanleOL: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); var i; event.list = []; event.list2 = []; var list4 = []; event.controls = ["不叫", "叫地主"]; if (!event.map) event.map = {}; var libCharacter = {}; for (var i = 0; i < lib.configOL.characterPack.length; i++) { var pack = lib.characterPack[lib.configOL.characterPack[i]]; for (var j in pack) { // if(j=='zuoci') continue; if (lib.character[j]) libCharacter[j] = pack[j]; } } for (i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (!libCharacter[ix[j]] || lib.filter.characterDisabled(ix[j], libCharacter)) ix.splice(j--, 1); } if (ix.length) { var name = ix.randomGet(); event.list.push(name); if (game.recommendDizhu.includes(name)) event.list2.push(name); list4.addArray(ix); } } for (i in libCharacter) { if (list4.includes(i) || lib.filter.characterDisabled(i, libCharacter)) continue; event.list.push(i); if (game.recommendDizhu.includes(i)) event.list2.push(i); } for (var player of game.players) { var id = player.playerid; if (!event.map[id]) event.map[id] = []; event.map[id].addArray(event.list2.randomRemove(1)); event.list.removeArray(event.map[id]); event.map[id].addArray(event.list.randomRemove(4 - event.map[id].length)); event.list2.removeArray(event.map[id]); } _status.characterlist = event.list.slice(0); event.videoId = lib.status.videoId++; game.broadcastAll( function (map, id) { ui.create.dialog("你的选将框", [map[game.me.playerid], "character"]).videoId = id; }, event.map, event.videoId ); event.start = game.players.randomGet(); event.current = event.start; if (event.current != game.me || !event.current.isOnline()) game.delay(3); "step 1"; event.current.chooseControl(event.controls).set("ai", function () { return Math.random() > 0.5 ? "不叫" : "叫地主"; }); "step 2"; event.current.chat(result.control); if (result.control == "叫地主" || event.current == event.start.next) { game.zhu = result.control == "叫地主" ? event.current : event.current.next; for (var player of game.players) { player.identity = player == game.zhu ? "zhu" : "fan"; player.showIdentity(); player.identityShown = true; } game.broadcastAll("closeDialog", event.videoId); event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); } else { event.current = event.current.next; event.goto(1); } "step 3"; var list = []; var str = "选择角色"; for (var i = 0; i < game.players.length; i++) { list.push([ game.players[i], [str, [event.map[game.players[i].playerid], "character"]], true, ]); } game.me.chooseButtonOL(list, function (player, result) { if (game.online || player == game.me) player.init(result.links[0], result.links[1]); }); "step 4"; for (var i in result) { if (result[i] && result[i].links) { for (var j = 0; j < result[i].links.length; j++) { event.list2.remove(result[i].links[j]); } } } for (var i in result) { if (result[i] == "ai") { result[i] = event.list2.randomRemove(lib.configOL.double_character ? 2 : 1); } else { result[i] = result[i].links; } if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i][0], result[i][1]); } } if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } game.broadcast( function (result, zhu) { for (var i in result) { if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i][0], result[i][1]); } } game.zhu = zhu; if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }, result, game.zhu ); for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterBinglinOL: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); var i; var libCharacter = {}; for (var i = 0; i < lib.configOL.characterPack.length; i++) { var pack = lib.characterPack[lib.configOL.characterPack[i]]; for (var j in pack) { // if(j=='zuoci') continue; if (lib.character[j]) libCharacter[j] = pack[j]; } } event.list = []; event.map = {}; for (i in libCharacter) { if (lib.filter.characterDisabled(i, libCharacter)) continue; event.list.push(i); } event.list.randomSort(); _status.characterlist = event.list.slice(0); event.controls = ["不叫地主", "一倍", "两倍", "三倍"]; for (var player of game.players) { var id = player.playerid; event.map[id] = event.list.randomRemove(4); } event.start = game.players.randomGet(); event.current = event.start; event.videoId = lib.status.videoId++; game.zhuSkill = "zhuSkill_" + ["xiangyang", "jiangling", "fancheng"].randomGet(); game.broadcastAll( function (map, id, skill) { ui.create.dialog("本局城池:" + get.translation(skill), [ map[game.me.playerid], "character", ]).videoId = id; }, event.map, event.videoId, game.zhuSkill ); game.delay(6); "step 1"; game.broadcastAll( function (id, current) { var dialog = get.idDialog(id); if (dialog) { if (game.me == current) dialog.content.firstChild.innerHTML = "是否叫地主?"; else dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主"; } }, event.videoId, event.current ); if (event.current != game.me && !event.current.isOnline()) game.delay(2); event.current.chooseControl(event.controls).set("ai", function () { return _status.event.getParent().controls.randomGet(); }); "step 2"; event.current._control = result.control; event.current.chat(result.control); if (result.control == "三倍") { game.bonusNum = 3; game.zhu = event.current; return; } else if (result.control != "不叫地主") { event.controls.splice(1, event.controls.indexOf(result.control)); event.tempDizhu = event.current; if (result.control == "二倍") game.bonusNum = 2; } event.current = event.current.next; if (event.current == event.start) { game.zhu = event.tempDizhu || event.start; } else event.goto(1); if (event.current == event.start.previous && !event.tempDizhu) event.controls.remove("不叫地主"); "step 3"; for (var player of game.players) { player.identity = player == game.zhu ? "zhu" : "fan"; player.showIdentity(); player.identityShown = true; player._characterChoice = event.map[player.playerid]; } event.map[game.zhu.playerid].addArray(event.list.randomRemove(3)); game.broadcastAll( function (id, map) { var dialog = get.idDialog(id); if (dialog) dialog.close(); game.me._characterChoice = map[game.me.playerid]; }, event.videoId, event.map ); var list = []; for (var i = 0; i < game.players.length; i++) { var dialog = ["请选择武将", [event.map[game.players[i].playerid], "character"]]; if (game.players[i].identity == "fan") { var friend = game.findPlayer(function (current) { return current != game.players[i] && current.identity == "fan"; }); dialog.push('
队友的选将框
'); dialog.push([event.map[friend.playerid], "character"]); } list.push([ game.players[i], dialog, true, function () { return Math.random(); }, function (button) { return _status.event.player._characterChoice.includes(button.link); }, ]); } game.me.chooseButtonOL(list, function (player, result) { if (game.online || player == game.me) player.init(result.links[0]); }); "step 4"; for (var i in lib.playerOL) { if (!result[i] || result[i] == "ai" || !result[i].links || !result[i].links.length) { result[i] = event.map[i].randomGet(); } else { result[i] = result[i].links[0]; } if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i]); } } if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } game.broadcast( function (result, zhu) { for (var i in result) { if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i]); } } game.zhu = zhu; if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }, result, game.zhu ); for (var player of game.players) { if (player == game.zhu) { player.addSkill(game.zhuSkill); } else player.addSkill(["binglin_shaxue", "binglin_neihong"]); } for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterZhidouOL: function () { var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); var i; var libCharacter = {}; for (var i = 0; i < lib.configOL.characterPack.length; i++) { var pack = lib.characterPack[lib.configOL.characterPack[i]]; for (var j in pack) { // if(j=='zuoci') continue; if (lib.character[j]) libCharacter[j] = pack[j]; } } var groups = []; event.list = []; event.map = {}; var chara = get.config("character_online") || lib.characterOnline; for (i in chara) { var list = chara[i]; for (var j = 0; j < list.length; j++) { if ( !lib.character[list[j]] || lib.connectBanned.includes(list[j]) || (i == "key" && lib.filter.characterDisabled(list[j], libCharacter)) ) list.splice(j--, 1); } if (list.length >= 3) { groups.push(i); event.list.addArray(list); } } event.list.randomSort(); _status.characterlist = event.list.slice(0); event.controls = ["不叫地主", "一倍", "两倍", "三倍"]; for (var player of game.players) { var id = player.playerid; player._group = groups.randomRemove(1)[0]; event.map[id] = chara[player._group].randomGets(3); player.storage.doudizhu_cardPile = get.cards(20).sort(function (a, b) { if (a.name != b.name) return lib.sort.card(a.name, b.name); else if (a.suit != b.suit) return lib.suit.indexOf(a) - lib.suit.indexOf(b); else return a.number - b.number; }); player.markSkill("doudizhu_cardPile"); } event.start = game.players.randomGet(); event.current = event.start; event.videoId = lib.status.videoId++; game.broadcastAll( function (map, id) { ui.create.dialog( "你的选将框和底牌", [map[game.me.playerid], "character"], game.me.storage.doudizhu_cardPile ).videoId = id; }, event.map, event.videoId ); game.delay(4); "step 1"; game.broadcastAll( function (id, current) { var dialog = get.idDialog(id); if (dialog) { if (game.me == current) dialog.content.firstChild.innerHTML = "是否叫地主?"; else dialog.content.firstChild.innerHTML = "请等待其他玩家叫地主"; } }, event.videoId, event.current ); if (event.current != game.me && !event.current.isOnline()) game.delay(2); event.current.chooseControl(event.controls).set("ai", function () { return _status.event.getParent().controls.randomGet(); }); "step 2"; event.current._control = result.control; event.current.chat(result.control); if (result.control == "三倍") { game.bonusNum = 3; game.zhu = event.current; return; } else if (result.control != "不叫地主") { event.controls.splice(1, event.controls.indexOf(result.control)); event.tempDizhu = event.current; if (result.control == "二倍") game.bonusNum = 2; } event.current = event.current.next; if ( event.current == event.start && (event.start == event.tempDizhu || event.start._control == "不叫地主") ) { game.zhu = event.tempDizhu || event.start.previous; } else if (event.current == event.start.next && event.current._control) { game.zhu = event.tempDizhu; } else event.goto(1); if (event.current == event.start.previous && !event.tempDizhu) event.controls.remove("不叫地主"); "step 3"; for (var player of game.players) { player.identity = player == game.zhu ? "zhu" : "fan"; player.showIdentity(); player.identityShown = true; } game.broadcastAll("closeDialog", event.videoId); var list = []; for (var i = 0; i < game.players.length; i++) { list.push([ game.players[i], [ "选择" + (game.players[i] == game.zhu ? "两" : "一") + "张武将牌", [event.map[game.players[i].playerid], "character"], ], true, game.players[i] == game.zhu ? 2 : 1, ]); } game.me.chooseButtonOL(list, function (player, result) { if (game.online || player == game.me) player.init(result.links[0], result.links[1]); }); "step 4"; for (var i in result) { if (result[i] == "ai") { result[i] = event.map[i].randomRemove(lib.playerOL[i] == game.zhu ? 2 : 1); } else { result[i] = result[i].links; } if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i][0], result[i][1]); } } game.zhu.hp = 4; game.zhu.maxHp = 4; game.zhu.update(); game.broadcast( function (result, zhu) { for (var i in result) { if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i][0], result[i][1]); } } game.zhu = zhu; game.zhu.hp = 4; game.zhu.maxHp = 4; game.zhu.update(); setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }, result, game.zhu ); for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, chooseCharacterOL: function () { if (_status.mode == "kaihei") { game.chooseCharacterKaiheiOL(); return; } else if (_status.mode == "huanle") { game.chooseCharacterHuanleOL(); return; } else if (_status.mode == "online") { game.chooseCharacterZhidouOL(); return; } else if (_status.mode == "binglin") { game.chooseCharacterBinglinOL(); return; } var next = game.createEvent("chooseCharacter"); next.setContent(function () { "step 0"; ui.arena.classList.add("choose-character"); var i; var identityList = ["zhu", "fan", "fan"]; identityList.randomSort(); for (i = 0; i < game.players.length; i++) { game.players[i].identity = identityList[i]; game.players[i].showIdentity(); game.players[i].identityShown = true; if (identityList[i] == "zhu") game.zhu = game.players[i]; } var list; var list4 = []; event.list = []; var libCharacter = {}; for (var i = 0; i < lib.configOL.characterPack.length; i++) { var pack = lib.characterPack[lib.configOL.characterPack[i]]; for (var j in pack) { // if(j=='zuoci') continue; if (lib.character[j]) libCharacter[j] = pack[j]; } } for (i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (!libCharacter[ix[j]] || lib.filter.characterDisabled(ix[j], libCharacter)) ix.splice(j--, 1); } if (ix.length) { event.list.push(i); list4.addArray(ix); } } game.broadcast(function (list) { for (var i in lib.characterReplace) { var ix = lib.characterReplace[i]; for (var j = 0; j < ix.length; j++) { if (!list.includes(ix[j])) ix.splice(j--, 1); } } }, list4); for (i in libCharacter) { if (list4.includes(i) || lib.filter.characterDisabled(i, libCharacter)) continue; event.list.push(i); list4.push(i); } _status.characterlist = list4; "step 1"; var list = []; var selectButton = lib.configOL.double_character ? 2 : 1; var num, num2 = 0; num = Math.floor(event.list.length / game.players.length); num2 = event.list.length - num * game.players.length; if (num > 5) { num = 5; } if (num2 > 2) { num2 = 2; } for (var i = 0; i < game.players.length; i++) { var num3 = 0; if (game.players[i] == game.zhu) num3 = 3; var str = "选择角色"; list.push([ game.players[i], [str, [event.list.randomRemove(num + num3), "characterx"]], selectButton, true, ]); } game.me.chooseButtonOL(list, function (player, result) { if (game.online || player == game.me) player.init(result.links[0], result.links[1]); }); "step 2"; for (var i in result) { if (result[i] && result[i].links) { for (var j = 0; j < result[i].links.length; j++) { event.list.remove(get.sourceCharacter(result[i].links[j])); } } } for (var i in result) { if (result[i] == "ai") { var listc = event.list.randomRemove(lib.configOL.double_character ? 2 : 1); for (var i = 0; i < listc.length; i++) { var listx = lib.characterReplace[listc[i]]; if (listx && listx.length) listc[i] = listx.randomGet(); } result[i] = listc; } else { result[i] = result[i].links; } if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i][0], result[i][1]); } } if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } game.broadcast( function (result, zhu) { for (var i in result) { if (!lib.playerOL[i].name) { lib.playerOL[i].init(result[i][0], result[i][1]); } } game.zhu = zhu; if (!game.zhu.isInitFilter("noZhuHp")) { game.zhu.maxHp++; game.zhu.hp++; game.zhu.update(); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }, result, game.zhu ); for (var i = 0; i < game.players.length; i++) { _status.characterlist.remove(game.players[i].name1); _status.characterlist.remove(game.players[i].name2); } setTimeout(function () { ui.arena.classList.remove("choose-character"); }, 500); }); }, }, translate: { zhu: "主", fan: "反", zhu2: "地主", fan2: "农民", random2: "随机", feiyang: "飞扬", bahu: "跋扈", feiyang_info: "判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。", bahu_info: "锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。", kaihei: "强易", kaihei_info: "出牌阶段,你可以获得一名其他角色的至多两张牌,然后交给其等量的牌。每名角色每局游戏限一次。", doudizhu_cardPile: "底牌", online_gongshoujintui: "攻守进退", gongshoujianbei: "攻守兼备", gongshoujianbei_info: "出牌阶段,你可选择:①将此牌当做【万箭齐发】使用。②将此牌当做【桃园结义】使用。", jintuiziru: "进退自如", jintuiziru_info: "出牌阶段,你可选择:①将此牌当做【南蛮入侵】使用。②将此牌当做【五谷丰登】使用。", diqi: "地契", diqi_skill: "地契", diqi_info: "当你受到伤害时,你可以弃置此牌,防止此伤害。当此牌离开你的装备区后,销毁之。", _juzhong: "聚众", juzhong_jiu: "聚众", zhadan: "炸弹", zhadan_info: "当一张牌被使用时,对此牌使用。取消此牌的所有目标,且本局游戏的底价翻倍。", jiwangkailai: "继往开来", jiwangkailai_info: "出牌阶段,对包含你自己在内的一名角色使用。目标角色选择一项:①弃置所有手牌,然后摸等量的牌。②将所有手牌当做一张不为【继往开来】的普通锦囊牌使用。", zhuSkill_xiangyang: "襄阳", zhuSkill_xiangyang_info: "回合结束时,你可获得一个额外的出牌阶段或摸牌阶段。", zhuSkill_jiangling: "江陵", zhuSkill_jiangling0: "江陵", zhuSkill_jiangling1: "江陵", zhuSkill_jiangling_info: "出牌阶段开始时,你可选择一项:①本阶段内使用【杀】或普通锦囊牌选择唯一目标时可增加一个目标。②本阶段内使用【杀】或普通锦囊牌无次数限制。", zhuSkill_fancheng: "樊城", zhuSkill_fancheng0: "樊城", zhuSkill_fancheng1: "樊城", zhuSkill_fancheng_info: "限定技,出牌阶段,你可选择获得一项效果直到游戏结束:①因执行【杀】的效果而对其他角色造成的伤害+1。②对其他角色造成的渠道不为【杀】的伤害+1。", binglin_shaxue: "歃血", binglin_shaxue_info: "锁定技,每局游戏限三次,当你受到队友造成的伤害时,你防止此伤害。", binglin_neihong: "内讧", binglin_neihong_info: "锁定技,当你杀死队友后,你所在的阵营视为游戏失败。", baiyidujiang: "白衣渡江", baiyidujiang_info: "出牌阶段,对地主使用。你选择一项:①令其将手牌数摸至全场最多。②令其将手牌数弃置至全场最少。", luojingxiashi: "落井下石", luojingxiashi_info: "出牌阶段,对所有其他的已受伤角色使用。目标角色受到1点伤害。", binglinchengxia: "兵临城下", binglinchengxia_info: "出牌阶段,对一名其他角色使用。将此牌横置于目标角色的判定区内。目标角色于判定阶段进行判定,若判定结果不为♦,则其弃置装备区内的所有牌或受到1点伤害。", toushiche: "投石车", toushiche_skill: "投石车", toushiche_info: "锁定技,结束阶段开始时,你令所有手牌数大于你的角色依次弃置一张手牌。", binglin_bingjin: "兵尽", }, element: { player: { getTopCards: function (num) { if (typeof num != "number") num = 1; if (num <= 0) num = 1; var cards; var player = this; if (player.storage.doudizhu_cardPile && player.storage.doudizhu_cardPile.length) { cards = player.storage.doudizhu_cardPile.randomRemove(num); if (player.storage.doudizhu_cardPile.length) player.markSkill("doudizhu_cardPile"); else player.unmarkSkill("doudizhu_cardPile"); } else cards = []; if (cards.length < num) cards.addArray(get.cards(num - cards.length)); else game.updateRoundNumber(); return cards; }, $dieAfter: function () { if (_status.video) return; if (!this.node.dieidentity) { var str = { zhu: "地主", fan: "农民" }[this.identity]; var node = ui.create.div(".damage.dieidentity", str, this); ui.refresh(node); node.style.opacity = 1; this.node.dieidentity = node; } var trans = this.style.transform; if (trans) { if (trans.indexOf("rotateY") != -1) { this.node.dieidentity.style.transform = "rotateY(180deg)"; } else if (trans.indexOf("rotateX") != -1) { this.node.dieidentity.style.transform = "rotateX(180deg)"; } else { this.node.dieidentity.style.transform = ""; } } else { this.node.dieidentity.style.transform = ""; } }, dieAfter: function (source) { if ( _status.mode == "binglin" && source && this != source && this.identity == source.identity && source.hasSkill("binglin_neihong") ) { if (game.me == game.zhu) { game.over(true); } else { game.over(false); } } else game.checkResult(); }, dieAfter2: function () { if (_status.mode == "binglin" || _status.mode == "online" || this.identity != "fan") return; var player = this, target = game.findPlayer(function (current) { return current != player && current.identity == "fan"; }, true); if (target) { target.showGiveup(); target.chooseDrawRecover(2); } }, logAi: function (targets, card) {}, showIdentity: function () { game.broadcastAll( function (player, identity) { player.identity = identity; player.node.identity.classList.remove("guessing"); player.identityShown = true; player.ai.shown = 1; player.setIdentity(); if (player.identity == "zhu") { player.isZhu = true; } if (_status.clickingidentity) { for (var i = 0; i < _status.clickingidentity[1].length; i++) { _status.clickingidentity[1][i].delete(); _status.clickingidentity[1][i].style.transform = ""; } delete _status.clickingidentity; } }, this, this.identity ); }, }, }, get: { rawAttitude: function (from, to) { if (from.identity == to.identity) return 10; return -10; }, }, skill: { binglin_bingjin: { trigger: { player: "phaseEnd" }, forced: true, ruleSkill: true, filter: function (event, player) { return _status.mode == "binglin" && game.roundNumber > 14; }, content: function () { player.loseHp(); }, }, zhuSkill_xiangyang: { trigger: { player: "phaseEnd" }, charlotte: true, direct: true, content: function () { "step 0"; player .chooseControl("摸牌阶段", "出牌阶段", "cancel2") .set("prompt", "襄阳:是否执行一个额外的阶段?"); "step 1"; if (result.control != "cancel2") { player.logSkill(event.name); var next = player[result.index ? "phaseUse" : "phaseDraw"](); event.next.remove(next); trigger.next.push(next); } }, }, zhuSkill_jiangling: { trigger: { player: "phaseUseBegin" }, direct: true, charlotte: true, content: function () { "step 0"; player .chooseControl("加目标", "多刀", "取消") .set("prompt", get.prompt2("zhuSkill_jiangling")) .set("ai", () => 3 - game.countPlayer()); "step 1"; if (result.index < 2) { player.logSkill("zhuSkill_jiangling"); player.addTempSkill("zhuSkill_jiangling" + result.index, "phaseUseAfter"); game.log(player, "选择了", "#y" + result.control, "的效果"); } }, }, zhuSkill_jiangling0: { trigger: { player: "useCard2" }, direct: true, charlotte: true, filter: function (event, player) { if (event.card.name != "sha" && get.type(event.card) != "trick") return false; if (!event.targets || event.targets.length != 1) return false; var info = get.info(event.card); if (info.allowMultiple == false) return false; if (event.targets && !info.multitarget) { if ( game.hasPlayer(function (current) { return ( !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current) ); }) ) { return true; } } return false; }, content: function () { "step 0"; var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标"; player .chooseTarget(get.prompt("zhuSkill_jiangling"), function (card, player, target) { var player = _status.event.player; if (_status.event.targets.includes(target)) return false; return ( lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target) ); }) .set("prompt2", prompt2) .set("ai", function (target) { var trigger = _status.event.getTrigger(); var player = _status.event.player; return ( get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1) ); }) .set("targets", trigger.targets) .set("card", trigger.card); "step 1"; if (result.bool) { if (!event.isMine() && !event.isOnline()) game.delayx(); event.targets = result.targets; } else { event.finish(); } "step 2"; if (event.targets) { player.logSkill("zhuSkill_jiangling", event.targets); if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets); else { //trigger.directHit.addArray(event.targets); trigger.targets.addArray(event.targets); } } }, }, zhuSkill_jiangling1: { charlotte: true, mod: { cardUsable: function (card, player) { if (card.name == "sha" || get.type(card) == "trick") return Infinity; }, }, }, zhuSkill_fancheng: { enable: "phaseUse", limited: true, charlotte: true, skillAnimation: true, animationColor: "gray", content: function () { "step 0"; player.awakenSkill("zhuSkill_fancheng"); player .chooseControl("杀", "其他") .set("prompt", "选择要强化的伤害") .set("ai", () => get.rand(0, 1)); "step 1"; player.addSkill("zhuSkill_fancheng" + result.index); game.log(player, "本局游戏内", result.index ? "#g杀以外" : "#y杀", "的伤害+1"); }, ai: { order: 100, result: { player: 100 }, }, }, zhuSkill_fancheng0: { trigger: { source: "damageBegin2" }, forced: true, charlotte: true, filter: function (event, player) { return ( event.player != player && event.card && event.card.name == "sha" && event.getParent().name == "sha" ); }, logTarget: "player", content: function () { trigger.num++; }, mark: true, marktext: "殺", intro: { content: "因执行【杀】的效果对其他角色造成的伤害+1" }, }, zhuSkill_fancheng1: { trigger: { source: "damageBegin2" }, forced: true, charlotte: true, filter: function (event, player) { return event.player != player && (!event.card || event.card.name != "sha"); }, logTarget: "player", content: function () { trigger.num++; }, mark: true, marktext: "谋", intro: { content: "不因【杀】对其他角色造成的伤害+1" }, }, binglin_shaxue: { init: function (player, skill) { player.addMark(skill, 3, false); }, trigger: { player: "damageBegin3" }, forced: true, charlotte: true, filter: function (event, player) { return ( event.source && player != event.source && player.identity == event.source.identity && player.countMark("binglin_shaxue") > 0 ); }, content: function () { trigger.cancel(); player.removeMark("binglin_shaxue", 1, false); trigger.source.removeMark("binglin_shaxue", 1, false); }, intro: { content: "剩余次数:#" }, ai: { viewHandcard: true, skillTagFilter: function (player, tag, arg) { return player != arg && arg.hasSkill("binglin_shaxue"); }, }, }, binglin_neihong: { charlotte: true }, toushiche_skill: { trigger: { player: "phaseJieshuBegin" }, forced: true, equipSkill: true, filter: function (event, player) { return lib.skill.toushiche_skill.logTarget(null, player).length > 0; }, logTarget: function (event, player) { var hs = player.countCards("h"); return game.filterPlayer(function (current) { return current != player && current.countCards("h") > hs; }); }, content: function () { "step 0"; event.targets = lib.skill.toushiche_skill.logTarget(null, player).sortBySeat(); "step 1"; var target = targets.shift(); if (target.countCards("h") > 0) target.chooseToDiscard("h", true); if (targets.length) event.redo(); }, }, online_gongshoujintui: { enable: "chooseToUse", filter: function (event, player) { var cards = player.getCards("hs"); for (var i of cards) { var name = get.name(i, player); if (name == "gongshoujianbei") { if ( event.filterCard( { name: "wanjian", isCard: true, cards: [i], }, player, event ) || event.filterCard( { name: "taoyuan", isCard: true, cards: [i], }, player, event ) ) return true; } if (name == "jintuiziru") { if ( event.filterCard( { name: "nanman", isCard: true, cards: [i], }, player, event ) || event.filterCard( { name: "wugu", isCard: true, cards: [i], }, player, event ) ) return true; } } return false; }, chooseButton: { dialog: function (event, player) { var list = []; if (player.countCards("hs", "gongshoujianbei")) { list.push(["锦囊", "", "wanjian"]); list.push(["锦囊", "", "taoyuan"]); } if (player.countCards("hs", "jintuiziru")) { list.push(["锦囊", "", "nanman"]); list.push(["锦囊", "", "wugu"]); } return ui.create.dialog("攻守兼备/进退自如", [list, "vcard"], "hidden"); }, filter: function (button, player) { var name = button.link[2]; var rawname = name == "wanjian" || name == "taoyuan" ? "gongshoujianbei" : "jintuiziru"; var cards = player.getCards("hs"); var evt = _status.event.getParent(); for (var i of cards) { if ( get.name(i, player) == rawname && evt.filterCard( { name: name, isCard: true, cards: [i], }, player, evt ) ) return true; } return false; }, check: function (button) { return _status.event.player.getUseValue({ name: button.link[2], isCard: true }); }, backup: function (links) { var name = links[0][2]; var rawname = name == "wanjian" || name == "taoyuan" ? "gongshoujianbei" : "jintuiziru"; return { popname: true, viewAs: { name: name, isCard: true }, filterCard: { name: rawname }, ai1: () => 1, }; }, prompt: function (links) { var name = links[0][2]; var rawname = name == "wanjian" || name == "taoyuan" ? "gongshoujianbei" : "jintuiziru"; return "将一张" + get.translation(rawname) + "当做" + get.translation(name) + "使用"; }, }, ai: { order: 10, result: { player: 1, }, }, }, doudizhu_cardPile: { intro: { content: "cardCount", }, }, kaihei: { enable: "phaseUse", filter: function (event, player) { return ( player == game.zhu && game.hasPlayer(function (current) { return lib.skill.kaihei.filterTarget(null, player, current); }) ); }, filterTarget: function (card, player, target) { return ( player != target && !target.storage.kaihei && target.countGainableCards(player, "he") > 0 ); }, content: function () { "step 0"; player.gainPlayerCard(target, [1, 2], "he", true); target.storage.kaihei = true; "step 1"; if (!result.bool || !result.cards.length) { event.finish(); return; } var num = result.cards.length; var hs = player.getCards("he"); if (hs.length) { if (hs.length <= num) event._result = { bool: true, cards: hs }; else player.chooseCard( "he", true, num, "选择交给" + get.translation(target) + get.cnNumber(num) + "张牌" ); } else event.finish(); "step 2"; if (result.bool && result.cards && result.cards.length) player.give(result.cards, target); }, ai: { viewHandcard: true, skillTagFilter: function (player, tag, target) { if (player == target || player.identity != "fan" || target.identity != "fan") return false; }, }, }, feiyang: { trigger: { player: "phaseJudgeBegin" }, charlotte: true, direct: true, filter: function (event, player) { return ( _status.mode != "online" && _status.mode != "binglin" && player == game.zhu && player.countCards("j") && player.countCards("h") > 1 ); }, content: function () { "step 0"; player .chooseToDiscard( "h", 2, get.prompt("feiyang"), "弃置两张手牌,然后弃置判定区里的一张牌" ) .set("logSkill", "feiyang") .set("ai", function (card) { if (_status.event.goon) return 6 - get.value(card); return 0; }) .set( "goon", (() => { if (player.hasSkillTag("rejudge") && player.countCards("j") < 2) return false; return player.hasCard(function (card) { if ( get.tag(card, "damage") && get.damageEffect( player, player, _status.event.player, get.natureList(card) ) >= 0 ) return false; return ( get.effect( player, { name: card.viewAs || card.name, cards: [card], }, player, player ) < 0 ); }, "j"); })() ); "step 1"; if (result.bool) { player.discardPlayerCard(player, "j", true); } }, }, bahu: { trigger: { player: "phaseZhunbeiBegin" }, charlotte: true, forced: true, filter: function (event, player) { return _status.mode != "online" && _status.mode != "binglin" && player == game.zhu; }, content: function () { player.draw(); }, mod: { cardUsable: function (card, player, num) { if ( _status.mode != "online" && _status.mode != "binglin" && player == game.zhu && card.name == "sha" ) return num + 1; }, }, }, diqi_skill: { trigger: { player: "damageBegin2" }, filter: function (event, player) { var card = player.getEquip("diqi"); return ( get.itemtype(card) == "card" && lib.filter.cardDiscardable(card, player, "diqi_skill") ); }, check: function (event, player) { return event.num >= Math.min(player.hp, 2); }, prompt2: function (event, player) { return ( "弃置" + get.translation(player.getEquip("diqi")) + "并防止即将受到的" + get.cnNumber(event.num) + "点伤害" ); }, content: function () { player.discard(player.getEquip("diqi")); trigger.cancel(); }, ai: { filterDamage: true, skillTagFilter: function (player, tag, arg) { if (arg && arg.player) { if (arg.player.hasSkillTag("jueqing", false, player)) return false; } }, }, }, online_aozhan: { trigger: { player: "phaseBefore" }, forced: true, popup: false, firstDo: true, filter: function (event, player) { return !_status._aozhan && game.roundNumber > 10; }, content: function () { var color = get.groupnature(player.group, "raw"); if (player.isUnseen()) color = "fire"; player.$fullscreenpop("鏖战模式", color); game.broadcastAll(function () { _status._aozhan = true; ui.aozhan = ui.create.div(".touchinfo.left", ui.window); ui.aozhan.innerHTML = "鏖战模式"; if (ui.time3) ui.time3.style.display = "none"; ui.aozhanInfo = ui.create.system("鏖战模式", null, true); lib.setPopped( ui.aozhanInfo, function () { var uiintro = ui.create.dialog("hidden"); uiintro.add("鏖战模式"); var list = [ "从第11轮开始,游戏将进入〔鏖战模式〕。", "在鏖战模式下,任何角色均不是非转化的【桃】的合法目标。【桃】可以被当做【杀】或【闪】使用或打出。", ]; var intro = '
    '; for (var i = 0; i < list.length; i++) { intro += "
  • " + list[i]; } intro += "
"; uiintro.add('
' + intro + "
"); var ul = uiintro.querySelector("ul"); if (ul) { ul.style.width = "180px"; } uiintro.add(ui.create.div(".placeholder")); return uiintro; }, 250 ); game.playBackgroundMusic(); }); game.removeGlobalSkill("online_aozhan"); game.countPlayer(function (current) { current.addSkill("aozhan"); }); }, }, online_juzhong: { trigger: { global: "useCard" }, direct: true, ruleSkill: true, filter: function (event, player) { return ( _status.mode == "online" && !event.all_excluded && event.player.isFriendOf(player) && event.player != player && lib.skill.online_juzhong.infos[event.card.name] && player.hasCard(function (card) { if (_status.connectMode) return true; return get.name(card, player) == event.card.name; }, "h") ); }, content: function () { "step 0"; player .chooseToDiscard( "是否响应【聚众】?", get.translation(trigger.player) + "使用了" + get.translation(trigger.card) + "。你可弃置一张名称相同的牌,令" + lib.skill.online_juzhong.infos[trigger.card.name][0], function (card, player) { return get.name(card, player) == _status.event.getTrigger().card.name; } ) .set("ai", lib.skill.online_juzhong.infos[trigger.card.name][2]).logSkill = [ "_juzhong", trigger.player, ]; "step 1"; if (result.bool) { lib.skill.online_juzhong.infos[trigger.card.name][1](); if (!event.goon) event.finish(); } else event.finish(); "step 2"; trigger.player .chooseTarget("你可选择一名角色,弃置其的一张牌", function (card, player, target) { return target.countDiscardableCards(player, "he") > 0; }) .set("ai", function (target) { var player = _status.event.player; return get.effect(target, { name: "guohe_copy2" }, player, player); }); "step 3"; if (result.bool) { var target = result.targets[0]; trigger.player.line(target, "green"); trigger.player.discardPlayerCard(target, true, "he"); } }, infos: { sha: [ "此【杀】的伤害值基数+1。", function () { var evt = _status.event._trigger; if (!evt.baseDamage) evt.baseDamage = 1; evt.baseDamage++; }, function (card) { var evt = _status.event.getTrigger(); if (!evt.targets.length) return 0; if ( evt.targets[0].hasShan() || evt.targets[0].hasSkillTag("filterDamage", null, { player: evt.targets[0], card: evt.card, }) ) return 0; return 1; }, ], shan: [ "其可弃置一名角色的一张牌。", function () { _status.event.goon = true; }, function (card) { if ( game.zhu.countCards("he", function (card) { return get.value(card, game.zhu) >= 6; }) ) return 7 - get.value(card); if ( game.zhu.countCards("he", function (card) { return get.value(card, game.zhu) > 0; }) ) return 5 - get.value(card); return 0; }, ], tao: [ "其摸两张牌。", function () { _status.event._trigger.player.draw(2); }, function (card) { return 6 - get.value(card); }, ], jiu: [ "其本回合的伤害值或回复值+1。", function () { var player = _status.event._trigger.player; player.addTempSkill("juzhong_jiu"); player.addMark("juzhong_jiu", 1, false); }, function (card) { return 6 - get.value(card); }, ], }, ai: { viewHandcard: true, skillTagFilter: function (player, tag, target) { if ( _status.mode != "online" || player == target || player.identity != target.identity ) return false; }, }, }, juzhong_jiu: { trigger: { player: "recoverBegin", source: "damageBegin1", }, forced: true, popup: false, content: function () { trigger.num += player.countMark("juzhong_jiu"); }, onremove: true, intro: { content: "本回合的伤害值和回复值+#" }, }, online_zhadan_button: { trigger: { global: "gameDrawAfter", player: ["gainEnd", "loseEnd"], }, firstDo: true, forced: true, charlotte: true, popup: false, silent: true, filter: function (event, player) { if (_status.mode != "online" || (player != game.me && !player.isOnline())) return; if (event.name != "lose") return !player.hasZhadan && player.countCards("hs", "zhadan") > 0; return player.hasZhadan && !player.countCards("hs", "zhadan"); }, content: function () { if (!player.hasZhadan) { player.hasZhadan = true; if (player == game.me) lib.skill.online_zhadan_button.initZhadan(); else player.send(function () { lib.skill.online_zhadan_button.initZhadan(); }); } else { delete player.hasZhadan; if (player == game.me) lib.skill.online_zhadan_button.removeZhadan(); else player.send(function () { lib.skill.online_zhadan_button.removeZhadan(); }); } }, initZhadan: function () { ui.zhadan_button = ui.create.control("激活炸弹", "stayleft", function () { if (this.classList.contains("hidden")) return; this.classList.toggle("glow"); if ( this.classList.contains("glow") && _status.event.type == "zhadan" && _status.event.isMine() && ui.confirm && _status.imchoosing ) { ui.click.cancel(ui.confirm.lastChild); } }); }, removeZhadan: function () { if (ui.zhadan_button) { ui.zhadan_button.remove(); delete ui.zhadan_button; } }, }, online_zhadan: { trigger: { player: "useCard" }, priority: 5, popup: false, forced: true, filter: function (event, player) { return game.hasPlayer(function (current) { return current.hasCard(function (card) { if (get.name(card) != "zhadan") return false; return lib.filter.cardEnabled(card, player, "forceEnable"); }, "hs"); }); }, forceLoad: true, content: function () { "step 0"; event.source = trigger.player; event.card = trigger.card; event.targets = trigger.targets; event._global_waiting = true; event.filterCard = function (card, player) { if (get.name(card) != "zhadan" || get.itemtype(card) != "card") return false; return lib.filter.cardEnabled(card, player, "forceEnable"); }; event.send = function (player, card, source, targets, id, id2, skillState) { if (skillState) { player.applySkills(skillState); } if ( player == game.me && ui.zhadan_button && !ui.zhadan_button.classList.contains("glow") ) { _status.event._result = { bool: false }; if (game.online) { _status.event._resultid = id; game.resume(); } return; } var str = get.translation(source); if (targets && targets.length) { str += "对" + get.translation(targets); } str += "使用了"; str += get.translation(card); str += ",是否对其使用【炸弹】?"; var next = player.chooseToUse({ filterCard: function (card, player) { if (get.name(card) != "zhadan" || get.itemtype(card) != "card") return false; return lib.filter.cardEnabled(card, player, "forceEnable"); }, prompt: str, _global_waiting: true, ai1: function (card) { var evt = _status.event.getParent("_zhadan")._trigger, player = _status.event.player; if (!evt) return 0; if (get.attitude(player, evt.player) > 0) return 0; var eff = 0; if (!targets.length) return Math.random() - 0.5; for (var i of targets) eff -= get.effect(i, evt.card, evt.player, player); return eff - 8; }, source: source, source2: targets, id: id, id2: id2, type: "zhadan", }); next.set("respondTo", [source, card]); if (game.online) { _status.event._resultid = id; game.resume(); } else { next.nouse = true; } }; "step 1"; var list = game.filterPlayer(function (current) { return current.hasCard(function (card) { if (get.name(card) != "zhadan") return false; return lib.filter.cardEnabled(card, player, "forceEnable"); }, "hs"); }); event.list = list; event.id = get.id(); list.sort(function (a, b) { return ( get.distance(event.source, a, "absolute") - get.distance(event.source, b, "absolute") ); }); "step 2"; if (event.list.length == 0) { event.finish(); } else if ( _status.connectMode && (event.list[0].isOnline() || event.list[0] == game.me) ) { event.goto(4); } else { event.current = event.list.shift(); event.send( event.current, event.card, event.source, event.targets, event.id, trigger.parent.id ); } "step 3"; if (result.bool) { event.zhadanresult = event.current; event.zhadanresult2 = result; if (event.current != game.me && !event.current.isOnline()) game.delayx(); event.goto(8); } else { event.goto(2); } "step 4"; var id = event.id; var sendback = function (result, player) { if (result && result.id == id && !event.zhadanresult && result.bool) { event.zhadanresult = player; event.zhadanresult2 = result; game.broadcast("cancel", id); if ( _status.event.id == id && _status.event.name == "chooseToUse" && _status.paused ) { return function () { event.resultOL = _status.event.resultOL; ui.click.cancel(); if (ui.confirm) ui.confirm.close(); }; } } else { if ( _status.event.id == id && _status.event.name == "chooseToUse" && _status.paused ) { return function () { event.resultOL = _status.event.resultOL; }; } } }; var withme = false; var withol = false; var list = event.list; for (var i = 0; i < list.length; i++) { if (list[i].isOnline()) { withol = true; list[i].wait(sendback); list[i].send( event.send, list[i], event.card, event.source, event.targets, event.id, trigger.parent.id, get.skillState(list[i]) ); list.splice(i--, 1); } else if (list[i] == game.me) { withme = true; event.send( list[i], event.card, event.source, event.targets, event.id, trigger.parent.id ); list.splice(i--, 1); } } if (!withme) { event.goto(6); } if (_status.connectMode) { if (withme || withol) { for (var i = 0; i < game.players.length; i++) { game.players[i].showTimer(); } } } event.withol = withol; "step 5"; if (result && result.bool && !event.zhadanresult) { game.broadcast("cancel", event.id); event.zhadanresult = game.me; event.zhadanresult2 = result; } "step 6"; if (event.withol && !event.resultOL) { game.pause(); } "step 7"; for (var i = 0; i < game.players.length; i++) { game.players[i].hideTimer(); } "step 8"; if (event.zhadanresult) { event.zhadanresult.$fullscreenpop("炸弹", get.groupnature(event.zhadanresult)); var next = event.zhadanresult.useResult(event.zhadanresult2); next.respondTo = [trigger.player, trigger.card]; game.bonusNum *= 2; game.updateRoundNumber(); } }, }, }, card: { baiyidujiang: { fullskin: true, enable: true, filterTarget: function (card, player, target) { return target == game.zhu; }, selectTarget: -1, type: "trick", content: function () { "step 0"; if (!player.isIn() || !target.isIn()) { event.finish(); return; } var num1 = 0, num2 = Infinity, str = get.translation(target); game.countPlayer(function (current) { var num = current.countCards("h"); if (num > num1) num1 = num; if (num < num2) num2 = num; }); var num = target.countCards("h"), choices = []; event.addIndex = 0; if (num < num1) { choices.push("令" + str + "将手牌摸至" + get.cnNumber(num1) + "张"); event.num1 = num1; } else event.addIndex++; if (num > num2) { choices.push("令" + str + "将手牌弃置至" + get.cnNumber(num2) + "张"); event.num2 = num2; } if (!choices.length) event.finish(); else if (choices.length == 1) event._result = { index: 0 }; else player .chooseControl() .set("choiceList", choices) .set("ai", function () { var evt = _status.event.getParent(); return get.attitude(evt.player, evt.target) > 0 ? 0 : 1; }); "step 1"; if (result.index + event.addIndex == 0) { target.drawTo(event.num1); } else target.chooseToDiscard(true, "h", target.countCards("h") - event.num2); }, ai: { order: 6, value: 4, useful: 2, tag: { draw: 1, loseCard: 1, }, result: { target: function (player, target, card, isLink) { var num1 = 0, num2 = Infinity, str = get.translation(target); game.countPlayer(function (current) { var num = current.countCards("h", function (cardx) { if (ui.selected.cards.includes(cardx)) return false; if (card.cards && card.cards.includes(cardx)) return false; return true; }); if (num > num1) num1 = num; if (num < num2) num2 = num; }); var num = target.countCards("h", function (cardx) { if (ui.selected.cards.includes(cardx)) return false; if (card.cards && card.cards.includes(cardx)) return false; return true; }); if (num1 > num) { if (get.attitude(player, target) > 0) return (num1 - num) / 1.2; } if (num2 < num) { if (get.attitude(player, target) > 0) return (num2 - num) / 1.2; } return 0; }, }, }, }, luojingxiashi: { fullskin: true, enable: true, type: "trick", selectTarget: -1, filterTarget: function (card, player, target) { return target != player && target.isDamaged(); }, content: function () { target.damage(); }, ai: { order: 3, value: 4, useful: 2, tag: { loseCard: 1, }, result: { target: -1.5, }, }, }, binglinchengxia: { fullskin: true, type: "delay", filterTarget: function (card, player, target) { return lib.filter.judge(card, player, target) && player != target; }, judge: function (card) { if (get.suit(card) == "diamond") return 0; return -3; }, effect: function () { "step 0"; if (result.bool == false) { if ( !player.countCards("e", function (card) { return lib.filter.cardDiscardable(card, player, "shuiyanqijuny"); }) ) { player.damage("nosource"); event.finish(); return; } else player.chooseControl("discard_card", "take_damage", function (event, player) { if (get.damageEffect(player, event.player, player) >= 0) { return "take_damage"; } if (player.hp >= 3 && player.countCards("e") >= 2) { return "take_damage"; } return "discard_card"; }); } else event.finish(); "step 1"; if (result.control == "discard_card") { player.discard( player.getCards("e", function (card) { return lib.filter.cardDiscardable(card, player, "shuiyanqijuny"); }) ); } else player.damage("nosource"); }, ai: { order: 1, value: 3, useful: 2, tag: { damage: 1, loseCard: 1, }, result: { target: function (player, target, card, isLink) { var es = target.getCards("e"); if (!es.length) return -1.5; var val = 0; for (var i of es) val += get.value(i, target); return -Math.min(1.5, val / 5); }, }, }, }, toushiche: { fullskin: true, type: "equip", subtype: "equip1", distance: { attackFrom: -3 }, ai: { basic: { equipValue: 2.5, }, }, skills: ["toushiche_skill"], }, gongshoujianbei: { fullskin: true, type: "trick", }, jintuiziru: { fullskin: true, type: "trick", }, diqi: { fullskin: true, type: "equip", subtype: "equip2", skills: ["diqi_skill"], destroy: "diqi_skill", ai: { basic: { equipValue: 6, }, }, }, zhadan: { audio: true, fullskin: true, type: "trick", ai: { basic: { useful: [6, 4], value: [6, 4], }, result: { player: 1 }, }, notarget: true, content: function () { var evt = event.getParent(2)._trigger; evt.targets.length = 0; evt.all_excluded = true; game.log(evt.card, "的效果被炸弹抵消了"); }, }, jiwangkailai: { audio: true, fullskin: true, type: "trick", enable: function (card, player) { var hs = player.getCards("h", function (cardx) { return cardx != card && (!card.cards || !card.cards.includes(cardx)); }); if (!hs.length) return false; var use = true, discard = true; for (var i of hs) { if (use && !game.checkMod(i, player, "unchanged", "cardEnabled2", player)) use = false; if (discard && !lib.filter.cardDiscardable(i, player, "jiwangkailai")) discard = false; if (!use && !discard) return false; } return true; }, selectTarget: -1, toself: true, filterTarget: function (card, player, target) { return target == player; }, modTarget: true, content: function () { "step 0"; var hs = player.getCards("h"); if (hs.length) { var use = true, discard = true; for (var i of hs) { if (use && !game.checkMod(i, player, "unchanged", "cardEnabled2", player)) use = false; if (discard && !lib.filter.cardDiscardable(i, player, "jiwangkailai")) discard = false; if (!use && !discard) break; } if (use && discard) player .chooseControl() .set("prompt", "继往开来:请选择一项") .set("choiceList", [ "弃置所有手牌,然后摸等量的牌", "将所有手牌当做一张普通锦囊牌使用", ]) .set("ai", function () { if (_status.event.player.countCards("h") > 2) return 0; return 1; }); else if (use) event._result = { index: 1 }; else if (discard) event._result = { index: 0 }; else event.finish(); } else event.finish(); "step 1"; var cards = player.getCards("h"); if (result.index == 0) { player.discard(cards); player.draw(cards.length); event.finish(); } else { var list = []; for (var i of lib.inpile) { if ( i != "jiwangkailai" && get.type(i) == "trick" && lib.filter.filterCard({ name: i, cards: cards }, player) ) list.push(["锦囊", "", i]); } if (list.length) { player .chooseButton(["继往开来:选择要使用的牌", [list, "vcard"]], true) .set("ai", function (button) { var player = _status.event.player; return player.getUseValue({ name: button.link[2], cards: player.getCards("h"), }); }); } else event.finish(); } "step 2"; if (result.bool) player.chooseUseTarget({ name: result.links[0][2] }, player.getCards("h"), true); }, ai: { basic: { order: 0.5, useful: 3, value: 5, }, result: { target: function (player, target) { if ( target.needsToDiscard(1) || !target.countCards("h", function (card) { return get.value(card, player) >= 5.5; }) ) return 1; return 0; }, }, tag: { draw: 2, }, }, }, }, characterOnline: { wei: [ "re_caocao", "re_guojia", "re_simayi", "re_xiahoudun", "xuzhu", "re_zhangliao", "re_zhenji", "ol_xiahouyuan", "dianwei", "re_xunyu", "zhanghe", "yujin_yujin", "re_caozhang", "wangyi", "guohuai", "hanhaoshihuan", "chenqun", "re_caoxiu", "guohuanghou", "sunziliufang", "xunyou", "xinxianying", "sp_caiwenji", "caoang", "caochun", "caohong", "sp_caoren", "chenlin", "sp_jiaxu", "litong", "sp_pangde", "simalang", "wanglang", "kuailiangkuaiyue", "wangji", "sp_simazhao", "sp_wangyuanji", "yuejin", "zangba", "xinpi", "liuye", "simashi", "zhuling", "duji", "caoanmin", ], shu: [ "re_guanyu", "re_huangyueying", "re_liubei", "re_machao", "re_zhangfei", "zhaoyun", "re_huangzhong", "re_weiyan", "re_pangtong", "ol_sp_zhugeliang", "re_menghuo", "re_zhurong", "re_fazheng", "re_masu", "guanxingzhangbao", "xin_liaohua", "old_madai", "re_jianyong", "wuyi", "zhangsong", "zhoucang", "liuchen", "xiahoushi", "re_zhangyi", "liyan", "guanyinping", "guansuo", "mayunlu", "mazhong", "mizhu", "sunqian", "xiahouba", "zhangxingcai", "wangping", "yanyan", "chendao", "ganfuren", "re_maliang", "dengzhi", "lifeng", "zhangyì", ], wu: [ "re_ganning", "re_huanggai", "re_sunquan", "re_sunshangxiang", "re_zhouyu", "old_zhoutai", "re_xiaoqiao", "re_taishici", "sunjian", "re_zhangzhang", "re_lingtong", "re_wuguotai", "xin_xusheng", "re_bulianshi", "re_chengpu", "handang", "xin_panzhangmazhong", "xin_zhuran", "guyong", "zhuhuan", "cenhun", "sundeng", "xuezong", "daxiaoqiao", "heqi", "kanze", "sunhao", "re_sunluyu", "sunshao", "zhugejin", "zumao", "dingfeng", "sunliang", "zhoufei", "weiwenzhugezhi", "xf_sufei", "xugong", "lingcao", "sunru", "lvdai", "panjun", "yanjun", "zhoufang", ], qun: [ "re_diaochan", "re_gongsunzan", "re_huatuo", "re_huaxiong", "re_lvbu", "ol_pangde", "re_yanwen", "jiaxu", "gaoshun", "xin_liubiao", "chengong", "re_gongsunyuan", "guotufengji", "dongbai", "fuwan", "liuxie", "sp_machao", "tadun", "yanbaihu", "yuanshu", "zhangbao", "yl_luzhi", "huangfusong", "sp_ganning", "huangjinleishi", "re_panfeng", "guosi", "sp_liuqi", "mangyachang", "gaolan", "lvkuanglvxiang", "xunchen", "sp_zhanghe", "re_hansui", "re_hejin", "zhujun", "ol_dingyuan", "hanfu", "wangrong", "dongcheng", "gongsunkang", "hucheer", "sp_sufei", "yj_xuhuang", "yj_zhanghe", "yj_zhangliao", "liuyao", "wangcan", "sp_taishici", "caimao", "jiling", ], key: [ "sp_key_yuri", "key_akane", "key_akiko", "key_ao", "key_harukakanata", "key_haruko", "key_hinata", "key_kengo", "key_komari", "key_kotori", "key_kyoko", "key_nagisa", "key_noda", "key_rei", "key_rin", "key_rumi", "key_ryoichi", "key_sasami", "key_shiorimiyuki", "key_shiroha", "key_shizuku", "key_tomoya", "key_tsumugi", "key_umi", "key_yoshino", "key_youta", "key_yukine", "key_nao", "key_misuzu", ], }, online_cardPile: [ ["spade", 1, "guding"], ["spade", 1, "zhadan"], ["spade", 2, "tengjia"], ["spade", 2, "cixiong"], ["spade", 3, "jiu"], ["spade", 3, "guohe"], ["spade", 4, "sha", "thunder"], ["spade", 4, "guohe"], ["spade", 5, "sha", "thunder"], ["spade", 5, "qinglong"], ["spade", 6, "sha", "thunder"], ["spade", 6, "jiwangkailai"], ["spade", 7, "sha", "thunder"], ["spade", 7, "jintuiziru"], ["spade", 8, "sha", "thunder"], ["spade", 8, "sha"], ["spade", 9, "jiu"], ["spade", 9, "sha"], ["spade", 10, "gongshoujianbei"], ["spade", 10, "sha"], ["spade", 11, "tiesuo"], ["spade", 11, "shunshou"], ["spade", 12, "tiesuo"], ["spade", 12, "zhangba"], ["spade", 13, "wuxie"], ["spade", 13, "dawanma"], ["club", 1, "baiyin"], ["club", 1, "zhuge"], ["club", 2, "tengjia"], ["club", 2, "bagua"], ["club", 3, "jiu"], ["club", 3, "sha"], ["club", 4, "jintuiziru"], ["club", 4, "sha"], ["club", 5, "sha", "thunder"], ["club", 5, "dilu"], ["club", 6, "sha", "thunder"], ["club", 6, "sha"], ["club", 7, "sha", "thunder"], ["club", 7, "sha"], ["club", 8, "sha", "thunder"], ["club", 8, "sha"], ["club", 9, "jiu"], ["club", 9, "sha"], ["club", 10, "tiesuo"], ["club", 10, "sha"], ["club", 11, "tiesuo"], ["club", 11, "sha"], ["club", 12, "tiesuo"], ["club", 12, "wuxie"], ["club", 13, "tiesuo"], ["club", 13, "jiedao"], ["club", 13, "wuxie"], ["heart", 1, "wuxie"], ["heart", 1, "gongshoujianbei"], ["heart", 1, "zhadan"], ["heart", 2, "huogong"], ["heart", 2, "shan"], ["heart", 3, "huogong"], ["heart", 3, "wuzhong"], ["heart", 4, "sha", "fire"], ["heart", 4, "tao"], ["heart", 5, "tao"], ["heart", 5, "chitu"], ["heart", 6, "tao"], ["heart", 6, "jiwangkailai"], ["heart", 7, "sha", "fire"], ["heart", 7, "tao"], ["heart", 8, "shan"], ["heart", 8, "wuzhong"], ["heart", 9, "shan"], ["heart", 9, "tao"], ["heart", 10, "sha", "fire"], ["heart", 10, "sha"], ["heart", 11, "shan"], ["heart", 11, "wuzhong"], ["heart", 12, "shan"], ["heart", 12, "guohe"], ["heart", 13, "wuxie"], ["heart", 13, "zhuahuang"], ["diamond", 1, "zhuque"], ["diamond", 1, "juedou"], ["diamond", 2, "tao"], ["diamond", 2, "shan"], ["diamond", 3, "tao"], ["diamond", 3, "shan"], ["diamond", 4, "sha", "fire"], ["diamond", 4, "shunshou"], ["diamond", 5, "sha", "fire"], ["diamond", 5, "guanshi"], ["diamond", 6, "shan"], ["diamond", 6, "sha"], ["diamond", 7, "shan"], ["diamond", 7, "shan"], ["diamond", 8, "shan"], ["diamond", 8, "shan"], ["diamond", 9, "jiu"], ["diamond", 9, "shan"], ["diamond", 10, "shan"], ["diamond", 10, "sha"], ["diamond", 11, "shan"], ["diamond", 11, "shan"], ["diamond", 12, "huogong"], ["diamond", 12, "tao"], ["diamond", 13, "xiliu"], ["diamond", 13, "sha"], ["diamond", 13, "wuxie"], ], help: { 斗地主: '
游戏规则
  • 游戏人数
    游戏人数为3人(地主x1 + 农民x2)。
  • 胜利条件
    农民:地主死亡。
    地主:所有农民死亡且自己存活。' + "
  • 死亡奖惩
    当有农民死亡时,若另一名农民存活,则其可以选择摸两张牌或回复1点体力。
  • 地主专属技能
    地主可以使用专属技能〖飞扬〗和〖跋扈〗。
    〖飞扬〗判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。
    〖跋扈〗锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。
", }, }; });