webxoss-client/DeckManager.js

223 lines
5.9 KiB
JavaScript
Raw Normal View History

2016-10-23 07:28:51 +02:00
'use strict';
function DeckManager () {
this.getDeckNames();
}
DeckManager.prototype.getDeckNames = function () {
var names = localStorage.getItem('deck_filenames');
this._deckNames = names? JSON.parse(names) : [];
return this._deckNames;
};
DeckManager.prototype._updateDeckNames = function () {
this._deckNames.sort();
localStorage.setItem('deck_filenames',JSON.stringify(this._deckNames));
};
DeckManager.prototype.createDeck = function (name,deck) {
if (inArr(name,this._deckNames)) return false;
this._deckNames.push(name);
this._updateDeckNames();
this.saveDeck(name,deck);
return true;
};
DeckManager.prototype.renameDeck = function (name,newName) {
if (!inArr(name,this._deckNames)) return false;
if (inArr(newName,this._deckNames)) return false;
var deck = this.loadDeck(name);
this.deleteDeck(name);
this.createDeck(newName,deck);
return true;
};
DeckManager.prototype.deleteDeck = function (name) {
if (!removeFromArr(name,this._deckNames)) return false;
this._updateDeckNames();
localStorage.removeItem('deck_file_'+name);
return true;
};
DeckManager.prototype.loadDeck = function (name) {
var deck = localStorage.getItem('deck_file_'+name);
if (!deck) return null;
return JSON.parse(deck);
};
DeckManager.prototype.saveDeck = function (name,deck) {
if (!inArr(name,this._deckNames)) return false;
localStorage.setItem('deck_file_'+name,JSON.stringify(deck));
return true;
};
DeckManager.prototype.checkMainDeck = function (pids) {
if (!isArr(pids)) return false;
if (pids.length !== 40) return false;
var infos = [];
for (var i = 0; i < pids.length; i++) {
var info = CardInfo[pids[i]];
if (!info) {
debugger;
return false
};
info = CardInfo[info.cid];
if (!info) {
debugger;
return false
};
infos.push(info);
}
if (infos.some(function (info) {
if (info.cardType === 'LRIG') return true;
if (info.cardType === 'ARTS') return true;
if (info.cardType === 'RESONA') return true;
})) return false;
if (this.burstCount(pids) !== 20) return false;
if (!this.checkDuplicate(pids)) return false;
return infos;
};
DeckManager.prototype.checkLrigDeck = function (pids) {
if (!isArr(pids)) return false;
if (pids.length > 10) return false;
var infos = [];
for (var i = 0; i < pids.length; i++) {
var info = CardInfo[pids[i]];
if (!info) return false;
info = CardInfo[info.cid];
if (!info) return false;
infos.push(info);
}
if (infos.some(function (info) {
if (info.cardType === 'SIGNI') return true;
if (info.cardType === 'SPELL') return true;
})) return false;
if (!infos.some(function (info) {
return (info.cardType === 'LRIG') && (info.level === 0);
})) return false;
if (!this.checkDuplicate(pids)) return false;
return infos;
};
DeckManager.prototype.checkMayusRoom = function (pids) {
var infos = [];
for (var i = 0; i < pids.length; i++) {
var info = CardInfo[pids[i]];
if (!info) return false;
info = CardInfo[info.cid];
if (!info) return false;
infos.push(info);
}
// 禁止 狐狸+修复 和 狐狸+Three out
if (infos.some(function (info) {
return info.cid === 33; // 狐狸
}) && infos.some(function (info) {
return (info.cid === 34) || (info.cid === 84); // 修复, three out
})) {
return false;
}
// 禁止 V・・C+共鸣・进军 和 V・・C+共鸣
if (infos.some(function (info) {
return info.cid === 1202; // V・・C
}) && infos.some(function (info) {
return (info.cid === 884) || (info.cid === 1369); // 共鸣・进军, 共鸣
})) {
return false;
}
// 禁止 Lock+割裂 和 Lock+精挖
if (infos.some(function (info) {
return info.cid === 534; // Lock
}) && infos.some(function (info) {
return (info.cid === 408) || (info.cid === 570); // 割裂, 精挖
})) {
return false;
}
// 禁止 Ar+魔术手
if (infos.some(function (info) {
return info.cid === 814; // Ar
}) && infos.some(function (info) {
return (info.cid === 1090); // 魔术手
})) {
return false;
}
// 禁止 双麻油
if (infos.some(function (info) {
return info.cid === 649; // 創世の巫女 マユ
}) && infos.some(function (info) {
return (info.cid === 1562); // 真名の巫女 マユ
})) {
return false;
}
2016-12-02 17:55:29 +01:00
// 禁止 台风蛇
if (infos.some(function (info) {
return info.cid === 957; // 台風一過
}) && infos.some(function (info) {
return (info.cid === 1652); // コードアンシエンツ ヘルボロス
})) {
return false;
}
2016-10-23 07:28:51 +02:00
// 限制
var limitMap = {
37: 2, // <忘得ぬ幻想 ヴァルキリー>
34: 2, // <修復>
178: 2, // <先駆の大天使 アークゲイン>
2017-05-09 17:52:53 +02:00
1501: 2, // <幻竜 アパト>
2016-10-23 07:28:51 +02:00
534: 1, // <ロック・ユー>
2016-12-10 07:29:55 +01:00
// 689: 1, // <>
2016-10-23 07:28:51 +02:00
474: 0, // <ノー・ゲイン>
23: 0, // <大器晩成>
2016-12-02 17:55:29 +01:00
689: 0, // <>
1030: 0, // <四面楚火>
1457: 0, // <サーバント Z>
2017-05-09 17:52:53 +02:00
1212: 0, // <コードアート C・L>
2016-10-23 07:28:51 +02:00
};
for (var i = 0; i < infos.length; i++) {
var info = infos[i];
var cid = info.cid;
if (cid in limitMap) {
limitMap[cid]--;
if (limitMap[cid] < 0) return false;
}
}
return true;
};
DeckManager.prototype.checkDeck = function (deck,mayusRoom) {
var valid = this.checkMainDeck(deck.mainDeck) &&
this.checkLrigDeck(deck.lrigDeck);
if (!valid) return false;
if ((mayusRoom === false)) return true;
return this.checkMayusRoom(deck.mainDeck.concat(deck.lrigDeck));
};
DeckManager.prototype.burstCount = function (pids) {
var count = 0;
pids.forEach(function (pid) {
var info = CardInfo[pid];
info = CardInfo[info.cid];
if (info.burstEffectTexts && info.burstEffectTexts.length) {
count++;
}
});
return count;
};
DeckManager.prototype.checkDuplicate = function (pids) {
var bucket = {};
pids.forEach(function (pid) {
var info = CardInfo[pid];
if (info.sideA) {
info = CardInfo[info.sideA]
}
2016-10-23 07:28:51 +02:00
if (info.cid in bucket) {
bucket[info.cid]++;
} else {
bucket[info.cid] = 1;
}
});
for (var cid in bucket) {
if (bucket[cid] > 4) return false;
}
return true;
};