webxoss-client/DeckEditor/Deck.min.js
2016-10-23 13:47:38 +08:00

1 line
No EOL
13 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)};