webxoss-client/DeckEditor/Deck.min.js
2016-11-18 18:06:55 +08:00

1 line
No EOL
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";function callConstructor(e){var r=e.bind.apply(e,arguments);return new r}function applyToConstructor(e,r){var t=concat(null,toArr(r)),n=e.bind.apply(e,t);return new n}function nextTick(e){setTimeout(e,0)}function DeckManager(){this.getDeckNames()}function TextualRule(e,r,t){this.prop=e,this.map=r,this.exact=t}function NumericRule(e,r){this.prop=e,this.keywords=r}function Searcher(){this.infos=[];for(var e in CardInfo)this.infos.push(CardInfo[e]);this.rules=[ColorRule,CrossRule,TypeRule,RarityRule,SkillRule,NoBurstRule,TimmingRule,LimitingRule,ClassRule,PowerRule,LevelRule,LimitRule,NumberRule,IllustRule,WxidRule,NameRule]}var concat=Array.prototype.concat.bind([]),toArr=function(e){return e?"string"==typeof e?[]:Array.prototype.slice.call(e,0):[]},isArr=Array.isArray,inArr=function(e,r){return toArr(r).indexOf(e)!=-1},removeFromArr=function(e,r){var t=r.indexOf(e);return!(t<0)&&(r.splice(t,1),!0)},isStr=function(e){return"string"==typeof e},isObj=function(e){return e&&"object"==typeof e&&!isArr(e)},isNum=function(e){return"number"==typeof e},isFunc=function(e){return"function"==typeof e},pEach=function(e,r,t){return e.reduce(function(e,t){return e.then(function(){return r(t)})},Promise.resolve())};DeckManager.prototype.getDeckNames=function(){var e=localStorage.getItem("deck_filenames");return this._deckNames=e?JSON.parse(e):[],this._deckNames},DeckManager.prototype._updateDeckNames=function(){this._deckNames.sort(),localStorage.setItem("deck_filenames",JSON.stringify(this._deckNames))},DeckManager.prototype.createDeck=function(e,r){return!inArr(e,this._deckNames)&&(this._deckNames.push(e),this._updateDeckNames(),this.saveDeck(e,r),!0)},DeckManager.prototype.renameDeck=function(e,r){if(!inArr(e,this._deckNames))return!1;if(inArr(r,this._deckNames))return!1;var t=this.loadDeck(e);return this.deleteDeck(e),this.createDeck(r,t),!0},DeckManager.prototype.deleteDeck=function(e){return!!removeFromArr(e,this._deckNames)&&(this._updateDeckNames(),localStorage.removeItem("deck_file_"+e),!0)},DeckManager.prototype.loadDeck=function(e){var r=localStorage.getItem("deck_file_"+e);return r?JSON.parse(r):null},DeckManager.prototype.saveDeck=function(e,r){return!!inArr(e,this._deckNames)&&(localStorage.setItem("deck_file_"+e,JSON.stringify(r)),!0)},DeckManager.prototype.checkMainDeck=function(e){if(!isArr(e))return!1;if(40!==e.length)return!1;for(var r=[],t=0;t<e.length;t++){var n=CardInfo[e[t]];if(!n)return!1;if(n=CardInfo[n.cid],!n)return!1;r.push(n)}return!r.some(function(e){return"LRIG"===e.cardType||("ARTS"===e.cardType||("RESONA"===e.cardType||void 0))})&&(20===this.burstCount(e)&&(!!this.checkDuplicate(e)&&r))},DeckManager.prototype.checkLrigDeck=function(e){if(!isArr(e))return!1;if(e.length>10)return!1;for(var r=[],t=0;t<e.length;t++){var n=CardInfo[e[t]];if(!n)return!1;if(n=CardInfo[n.cid],!n)return!1;r.push(n)}return!r.some(function(e){return"SIGNI"===e.cardType||("SPELL"===e.cardType||void 0)})&&(!!r.some(function(e){return"LRIG"===e.cardType&&0===e.level})&&(!!this.checkDuplicate(e)&&r))},DeckManager.prototype.checkMayusRoom=function(e){for(var r=[],t=0;t<e.length;t++){var n=CardInfo[e[t]];if(!n)return!1;if(n=CardInfo[n.cid],!n)return!1;r.push(n)}if(r.some(function(e){return 33===e.cid})&&r.some(function(e){return 34===e.cid||84===e.cid}))return!1;if(r.some(function(e){return 1202===e.cid})&&r.some(function(e){return 884===e.cid||1369===e.cid}))return!1;if(r.some(function(e){return 534===e.cid})&&r.some(function(e){return 408===e.cid||570===e.cid}))return!1;if(r.some(function(e){return 814===e.cid})&&r.some(function(e){return 1090===e.cid}))return!1;if(r.some(function(e){return 649===e.cid})&&r.some(function(e){return 1562===e.cid}))return!1;for(var i={37:2,34:2,178:2,534:1,689:1,474:0,23:0},t=0;t<r.length;t++){var n=r[t],u=n.cid;if(u in i&&(i[u]--,i[u]<0))return!1}return!0},DeckManager.prototype.checkDeck=function(e,r){var t=this.checkMainDeck(e.mainDeck)&&this.checkLrigDeck(e.lrigDeck);return!!t&&(r===!1||this.checkMayusRoom(e.mainDeck.concat(e.lrigDeck)))},DeckManager.prototype.burstCount=function(e){var r=0;return e.forEach(function(e){var t=CardInfo[e];t=CardInfo[t.cid],t.burstEffectTexts&&t.burstEffectTexts.length&&r++}),r},DeckManager.prototype.checkDuplicate=function(e){var r={};e.forEach(function(e){var t=CardInfo[e];t.cid in r?r[t.cid]++:r[t.cid]=1});for(var t in r)if(r[t]>4)return!1;return!0},TextualRule.prototype.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}var u=this.prop,o=this.exact;return function(e){return!r.length||r.some(function(r){var t=e[u].toLowerCase();return o?t===r:t.indexOf(r)!==-1})}},TextualRule.prototype.parseWord=function(e){for(var r in this.map){var t=this.map[r];if(t.some(function(r){return e===Localize.traditionalize(r)},this))return r}return null};var ColorRule=new TextualRule("color",{colorless:["colorless","无","无色","無","incolore","무","무색"],white:["white","白","白色","白","белая","bianco","백","백색"],black:["black","黑","黑色","黒","чёрная","nero","흑","흑색"],red:["red","红","红色","赤","красная","rosso","적","적색"],blue:["blue","蓝","蓝色","青","синяя","blu","청","청색"],green:["green","绿","绿色","緑","зелёная","verde","녹","녹색"]},!1),TypeRule=new TextualRule("cardType",{lrig:["l","lrig","分身","ルリグ","идел","루리그"],signi:["s","signi","精灵","シグニ","запись","시그니"],spell:["spell","魔法","スペル","магия","스펠"],arts:["arts","必杀","技艺","アーツ","умение","아츠"],resona:["resona","共鸣","レゾナ","отголосок","레조나"]},!0),RarityRule=new TextualRule("rarity",{c:["c"],r:["r"],lc:["lc"],sr:["sr"],lr:["lr"],st:["st"],pr:["pr"],sp:["sp"]},!0),SkillRule={};SkillRule.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}return function(e){return!r.length||(e=CardInfo[e.cid],r.some(function(r){var t=e[r];return t&&t.length}))}},SkillRule.parseWord=TextualRule.prototype.parseWord,SkillRule.map={constEffectTexts:["【常】","常","常时","常时效果","常時能力","【常】","常","常時","常時效果","常時能力","[constant]","const","constant","[постоянно]","постоянно","상시","[상시]"],startUpEffectTexts:["【出】","出","出场","出场效果","出场能力","【出】","出","出現","出現效果","出現能力","[on-play]","[onplay]","on-play","onplay","[при вводе]","при вводе","출현","[출현]"],actionEffectTexts:["【起】","起","起动","起动效果","起动能力","【起】","起","起動","起動效果","起動能力","[action]","action","[действие]","действие","기동","[기동]"],burstEffectTexts:["【※】","※","爆发","迸发","爆发效果","迸发效果","生命爆发","生命迸发","生命爆发效果","生命迸发效果","ライフバースト","バースト","burst","lifeburst","lb","вспышка","жизненная вспышка","라이프 버스트","라이프버스트","버스트"]};var NoBurstRule={};NoBurstRule.parse=function(e){for(var r=!1,t=0;t<e.length;t++){var n=e[t];this.parseWord(n)&&(r=!0,e.splice(t,1),t--)}return function(e){return!r||(e=CardInfo[e.cid],!("SIGNI"!==e.cardType&&"SPELL"!==e.cardType||e.burstEffectTexts&&e.burstEffectTexts.length))}},NoBurstRule.parseWord=TextualRule.prototype.parseWord,NoBurstRule.map={burstEffectTexts:["无爆发","无迸发","无爆发效果","无迸发效果","无生命爆发","无生命迸发","无生命爆发效果","无生命迸发效果","noburst","ライフバースト-","バースト-","迸发-","爆发-","burst-","lifeburst-","lb-","вспышка-","жизненная вспышка-","버스트-","라이프버스트-"]};var CrossRule={};CrossRule.parse=function(e){for(var r=!1,t=0;t<e.length;t++){var n=e[t];this.parseWord(n)&&(r=!0,e.splice(t,1),t--)}return function(e){return!r||(e=CardInfo[e.cid],"SIGNI"===e.cardType&&(e.crossLeft||e.crossRight))}},CrossRule.parseWord=TextualRule.prototype.parseWord,CrossRule.map={cross:["cross","交错","クロス","связь","크로스","[cross]",">cross<","【cross】","【交错】","【クロス】","[связь]",">크로스<"]};var TimmingRule={};TimmingRule.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}return function(e){return!r.length||r.some(function(r){return!!e.timmings&&inArr(r,e.timmings)})}},TimmingRule.parseWord=TextualRule.prototype.parseWord,TimmingRule.map={mainPhase:["主要阶段","【主要阶段】","主要","メインフェイズ","【メインフェイズ】","[mainphase]","mainphase","main","[основнаяфаза]","основнаяфаза","основная","메인","메인페이즈","[메인페이즈]"],attackPhase:["攻击阶段","【攻击阶段】","攻击","アタックフェイズ","【アタックフェイズ】","[attackphase]","attackphase","attack","[фазаатаки]","фазаатаки","атака","어택","어택페이즈","[어택페이즈]"],spellCutIn:["魔法切入","【魔法切入】","切入","スペルカットイン","【スペルカットイン】","[spellcut-in]","[cut-in]","[spellcutin]","[cutin]","spellcutin","cutin","cut","[ответнамагию]","[ответ]","ответнамагию","ответ","컷인","컷인","[스펠컷인]","스펠컷인"]};var LimitingRule={};LimitingRule.parse=function(e){for(var r=[],t=!1,n=0;n<e.length;n++)for(var i=e[n],u=["タマ","花代","ユヅキ","ピルルク","エルドラ","ミルルン","緑子","アン","ウリス","イオナ","ウムル","リメンバ","タウィル","サシェ","ミュウ","アイヤイ","アルフォウ","ハナレ"],o=0;o<u.length;o++){var a=u[o],s=!1,c=Localize("class",a).toLowerCase();if(i===c?s=!0:i===c+"+"&&(s=!0,t=!0),s){r.push(a),e.splice(n,1),n--;break}}return function(e){return!r.length||("LRIG"===e.cardType?r.some(function(r){return!!e.classes&&inArr(r,e.classes)},this):e.limiting?inArr(e.limiting,r):t)}};var ClassRule={};ClassRule.parse=function(e){for(var r=[],t=0;t<e.length;t++)for(var n=e[t],i=["精像","天使","悪魔","美巧","精武","アーム","ウェポン","遊具","毒牙","精羅","鉱石","宝石","植物","原子","宇宙","精械","電機","古代兵器","迷宮","精生","水獣","空獣","地獣","龍獣","凶蟲","精元"],u=0;u<i.length;u++){var o=i[u];if(n===Localize("class",o).toLowerCase().replace(" ","")){r.push(o),e.splice(t,1),t--;break}}return function(e){return!r.length||r.some(function(r){return!!e.classes&&inArr(r,e.classes)},this)}},NumericRule.prototype.parseExpression=function(e){var r;if(r=e.match(/^=*(\d+)$/)){var t=parseInt(r[1]);return[t,t]}if(r=e.match(/^>=*(\d+)\+?$/),r||(r=e.match(/^(\d+)\+$/)),r){var t=parseInt(r[1]);return[t,1/0]}if(r=e.match(/^<=*(\d+)\-?$/),r||(r=e.match(/^(\d+)\-$/)),r){var t=parseInt(r[1]);return[-(1/0),t]}if(r=e.match(/^(\d+)[\-\~](\d+)$/)){var n=parseInt(r[1]),i=parseInt(r[2]);return[n,i]}return null},NumericRule.prototype.parseWord=function(e){for(var r=0;r<this.keywords.length;r++){var t=Localize.traditionalize(this.keywords[r]);if(0===e.indexOf(t))return e=e.slice(t.length).replace(/^:/,""),this.parseExpression(e)}return null},NumericRule.prototype.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}var u=this.prop;return function(e){return!r.length||"SPELL"!==e.cardType&&"ARTS"!==e.cardType&&r.every(function(r){var t=e[u],n=r[0],i=r[1];return t>=n&&t<=i})}};var PowerRule=new NumericRule("power",["力量","パワー","power","сила","파워"]),LevelRule=new NumericRule("level",["等级","レベル","level","lv.","lv","уровень","livello","레벨"]),LimitRule=new NumericRule("limit",["界限","リミット","limite","limit","ограничение","리미트"]),NumberRule=new NumericRule("",[""]);NumberRule.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}return function(e){return r.every(function(r){function t(e){return!isFinite(e)||e<10}if("SPELL"===e.cardType||"ARTS"===e.cardType)return!1;var n=r.every(t)?e.level:e.power,i=r[0],u=r[1];return n>=i&&n<=u})}};var IllustRule={};IllustRule.parseWord=function(e){var r=e.match(/illust:?(.+)/);return r||(r=e.match(/画师:?(.+)/)),r||(r=e.match(/畫師:?(.+)/)),r?r[1]:null},IllustRule.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}return function(e){return!r.length||r.some(function(r){var t=e.illust.toLowerCase();return t.indexOf(r)!==-1})}};var WxidRule={};WxidRule.parseWord=function(e){var r=e.match(/^(wx\d{2}|wd\d{2}|pr|sp\d{2})-?(\d{0,3})$/);return r?r[1]+"-"+r[2]:null},WxidRule.parse=function(e){for(var r=[],t=0;t<e.length;t++){var n=e[t],i=this.parseWord(n);i&&(r.push(i),e.splice(t,1),t--)}return function(e){return!r.length||r.some(function(r){return 0===e.wxid.toLowerCase().indexOf(r)})}};var NameRule={};NameRule.dotRegex=/[\u00B7\u0387\u05BC\u2022\u2027\u2219\u22C5\u30FB\uFF0E\uFF65]/g,NameRule.fullWidth="",NameRule.halfWidth="0123456789=@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",NameRule.normalizeString=function(e){var r=e.replace(this.dotRegex,"").split("");return r.forEach(function(e,t){var n=this.fullWidth.indexOf(e);r[t]=this.halfWidth[n]||e},this),r.join("").toLowerCase()},NameRule.parse=function(e){var r=[];e.forEach(function(e){r.push(e.split(/\|+/))},this),e.length=0;var t=this;return function(e){return r.every(function(r){return!r.length||r.some(function(r){var n=t.normalizeString(Localize.cardName(e)),i=t.normalizeString(r);return n.indexOf(i)!==-1},this)},this)}},Searcher.prototype.search=function(e){var r=e.toLowerCase().split(/\s+/),t=this.rules.map(function(e){return e.parse(r)},this);return t.reduce(function(e,r){return e.filter(r)},this.infos)};