diff options
| author | Mistivia <i@mistivia.com> | 2025-02-08 16:43:20 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-02-08 16:45:54 +0800 |
| commit | 5db7a8c78da09e7d5f7454ba019d39be04d8795e (patch) | |
| tree | 4264c2d4a1008fc65ffb04fd93226a8b6998f698 /src/control | |
| parent | ea9350a570fcb8011bb2678ad8b60486772e411d (diff) | |
version 0.1
Diffstat (limited to 'src/control')
| -rw-r--r-- | src/control/deck.js | 103 | ||||
| -rw-r--r-- | src/control/search.js | 69 |
2 files changed, 167 insertions, 5 deletions
diff --git a/src/control/deck.js b/src/control/deck.js index 98c48fb..d47b21c 100644 --- a/src/control/deck.js +++ b/src/control/deck.js @@ -1,16 +1,112 @@ import { writable } from "svelte/store"; import { parseYdke } from '../utils'; +import { cardDb } from '../data/cardDb'; let deck = writable({main: [], extra: [], side: []}); +let deckState = {main: [], extra: [], side: []}; function setDeck(d) { - d.main.sort(); - d.extra.sort(); - d.side.sort(); + let sortFn = (a, b) => {return cardDb[a].cid - cardDb[b].cid;} + d.main.sort(sortFn); + d.extra.sort(sortFn); + d.side.sort(sortFn); + deckState = d; deck.set(d); localStorage.setItem('cachedDeck', JSON.stringify(d)); }; +const OK = 1; +const FAIL = 0; + +function canAdd(d, id) { + let count = 0; + for (let c of d.main) { + if (c === id) count += 1; + } + for (let c of d.side) { + if (c === id) count += 1; + } + for (let c of d.extra) { + if (c === id) count += 1; + } + if (count + 1 > 3) return false; + return true; +} + +function delCard(deck, id) { + for (let i = 0; i < deck.length; i++) { + if (deck[i] == id) { + deck.splice(i, 1); + return true; + } + } + return false; +} + +let deckOps = { + "deleteCard": (from, id) => { + if (from === 'main') { + delCard(deckState.main, id); + setDeck(deckState); + } else if (from === 'side') { + delCard(deckState.side, id); + setDeck(deckState); + } else if (from === 'extra') { + delCard(deckState.extra, id); + setDeck(deckState); + } + }, + "main2side": (id) => { + if (delCard(deckState.main, id)) { + deckState.side.push(id); + } + setDeck(deckState); + }, + "extra2side": (id) => { + if (delCard(deckState.extra, id)) { + deckState.side.push(id); + } + setDeck(deckState); + }, + "side2main": (id) => { + if (cardDb[id].isExtra) return; + if (delCard(deckState.side, id)) { + deckState.main.push(id); + } + setDeck(deckState); + }, + "side2extra": (id) => { + if (!cardDb[id].isExtra) return; + if (delCard(deckState.side, id)) { + deckState.extra.push(id); + } + setDeck(deckState); + }, + "add2extra": (id) => { + if (!cardDb[id].isExtra) return; + let d = deckState; + if (canAdd(d, id)) { + d.extra.push(id); + setDeck(d); + } + }, + "add2main": (id) => { + if (cardDb[id].isExtra) return; + let d = deckState; + if (canAdd(d, id)) { + d.main.push(id); + setDeck(d); + } + }, + "add2side": (id) => { + let d = deckState; + if (canAdd(d, id)) { + d.side.push(id); + setDeck(d); + } + } +}; + function initDeck() { let url = window.location.href.split('#'); if (url.length === 2) { @@ -34,5 +130,6 @@ initDeck(); export { deck, setDeck, + deckOps, }; diff --git a/src/control/search.js b/src/control/search.js index 93a9fc9..64e97f7 100644 --- a/src/control/search.js +++ b/src/control/search.js @@ -1,7 +1,72 @@ import { writable } from 'svelte/store'; +import { cardDb } from '../data/cardDb'; -let resultCards = writable([]); +let showingCards = writable([]); +let resultCards = []; + +let curVer = 0; +let curPage = 0; + +function showCards() { + showingCards.set(resultCards.slice(curPage * 10, curPage * 10 + 10)); +} + +function changeInput(query) { + curVer += 1; + query = query.split(' '); + setTimeout(()=>{doSearch(curVer, query)}, 0); +} + +function doSearch(ver, query) { + let result = []; + for (let key in cardDb) { + if (ver !== curVer) { + return; + } + let hit = true; + for (let word of query) { + let matched = false; + for (let name of cardDb[key].names) { + if (name.toLowerCase().includes(word.toLowerCase())) { + matched = true; + break; + } + } + if (!matched) { + hit = false; + break; + } + } + if (hit) { + result.push({"id": key, "name": cardDb[key].names[0]}) + } + } + if (ver !== curVer) return; + result.sort((a, b) => { + return cardDb[a.id].cid - cardDb[b.id].cid; + }); + resultCards = result; + curPage = 0; + showCards(); +} + +function onPrevPage() { + if (curPage > 0) { + curPage -= 1; + showCards(); + } +} + +function onNextPage() { + if (curPage < Math.floor(resultCards.length / 10) - 1) { + curPage += 1; + showCards(); + } +} export { - resultCards, + changeInput, + onPrevPage, + onNextPage, + showingCards, }; |
