diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b50b2b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +webcrawler/__pycache__/* +backup/ +build/ +fgo_editor.* +temp* +*_web.json \ No newline at end of file diff --git a/FGO.rar b/FGO.rar new file mode 100644 index 0000000..3e9be5e Binary files /dev/null and b/FGO.rar differ diff --git a/README.md b/README.md index 953398c..089cd87 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,33 @@ -# mgneko.github.io -可製作FGO台服所持5星英靈一覽表並產生為圖片 +# Site: https://leaflu0315.github.io/fgo/ -左鍵增加,右鍵減少寶具等級,選擇完成後可點選產出圖片於新視窗產生 +可製作FGO台/日服所持5星英靈一覽表並產生為圖片 + +This project can produce a list of your 5 star deck in Taiwan/Japan version of FGO, and also create a image to download. + +* 功能(Features): + + - **設定數量**: 左鍵增加,右鍵減少寶具等級,選擇完成後可點選產出圖片於新視窗產生 + + In "設定數量" tag, use the left button to increase the NP level, the right button to decrease the NP level (first hit will be NP 5). + + - **設定標記**: 可設定不要或愛心 + + In "設定標記" tag, you can set "NO" or "Love". + + - **福袋期望值**: 可計算新/盤/婆率 + + In "福袋期望值" tag, it can calculate "New", "Overflow", or "Wife"'s percentage. + + - **產出圖片**: 可產出設定結果的圖片 + + Click the "產出圖片" to generate in a new window. + +感謝原作者之作品: + +Thanks for the original author and here is his github: + +https://github.com/mgneko/mgneko.github.io + +此版本陸續更新進度 由LeafLu@ptt維護 + +This version will be maintained by LeafLu in Taiwan ptt. \ No newline at end of file diff --git a/exceptions.json b/exceptions.json new file mode 100644 index 0000000..9ddf8c6 --- /dev/null +++ b/exceptions.json @@ -0,0 +1,11 @@ +{ + "巌窟王 エドモン・ダンテス": "巌窟王", + "ジェームズ・モリアーティ(新宿のアーチャー)": "ジェームズ・モリアーティ", + "魔王信長(織田信長)": "魔王信長", + "グレゴリー・ラスプーチン": "言峰綺礼", + "武田信玄(武田晴信)": "武田晴信", + "アルトリア・キャスター(バーサーカー)": "アルトリア・キャスター", + "救世主トネリコ(雨の魔女トネリコ)": "雨の魔女トネリコ", + "阿曇磯良(ひびき&千鍵)": "ひびき&千鍵", + "カレン・C・オルテンシア(アムール〔カレン〕)": "アムール〔カレン〕" +} \ No newline at end of file diff --git a/fgo.ico b/fgo.ico new file mode 100644 index 0000000..04829b4 Binary files /dev/null and b/fgo.ico differ diff --git a/fonts/NotoSansJP-Regular.woff2 b/fonts/NotoSansJP-Regular.woff2 new file mode 100644 index 0000000..e02a072 Binary files /dev/null and b/fonts/NotoSansJP-Regular.woff2 differ diff --git a/fonts/NotoSansTC-Regular.woff2 b/fonts/NotoSansTC-Regular.woff2 new file mode 100644 index 0000000..31e55d6 Binary files /dev/null and b/fonts/NotoSansTC-Regular.woff2 differ diff --git a/i18n.js b/i18n.js new file mode 100644 index 0000000..3e40c97 --- /dev/null +++ b/i18n.js @@ -0,0 +1,175 @@ +// =================================================================================== +// 多國語言資料庫 (i18n) +// =================================================================================== +const i18n = { + // HTML Elements + pageTitle: { + "zh-TW": "FGO持有五星英靈一覽表", + "ja": "FGO所持星5サーヴァント一覧", + "en": "FGO 5-Star Servant Checklist" + }, + mainTitle: { + "zh-TW": "FGO持有五星英靈一覽表", + "ja": "FGO所持星5サーヴァント一覧", + "en": "FGO 5-Star Servant Checklist" + }, + switchAccount: { + "zh-TW": "切換帳號", + "ja": "アカウント切替", + "en": "Switch Account" + }, + setAmount: { + "zh-TW": "設定數量", + "ja": "宝具Lv設定", + "en": "Set NP Level" + }, + breakthroughBtn: { + "zh-TW": "突破按鈕", + "ja": "限界突破", + "en": "Max Limit" + }, + setMark: { + "zh-TW": "設定標記", + "ja": "マーク設定", + "en": "Set Mark" + }, + resetMark: { + "zh-TW": "重設標記", + "ja": "マークリセット", + "en": "Reset Marks" + }, + luckyBagValue: { + "zh-TW": "福袋期望值", + "ja": "福袋期待値", + "en": "GSSR Calculator" + }, + clearAll: { + "zh-TW": "清空", + "ja": "リセット", + "en": "Clear All" + }, + generateImage: { + "zh-TW": "產出圖片", + "ja": "画像生成", + "en": "Generate Image" + }, + importData: { + "zh-TW": "匯入資料", + "ja": "インポート", + "en": "Import Data" + }, + exportData: { + "zh-TW": "匯出資料", + "ja": "エクスポート", + "en": "Export Data" + }, + fourStarLink: { + "zh-TW": "FGO持有四星英靈一覽表", + "ja": "FGO所持星4サーヴァント一覧", + "en": "FGO 4-Star Servant Checklist" + }, + reportProblem: { + "zh-TW": "問題回報", + "ja": "問題報告", + "en": "Report Issue" + }, + setLv120: { + "zh-TW": "設定120等", + "ja": "Lv120設定", + "en": "Set Lv 120" + }, + setCrowned: { + "zh-TW": "設定戴冠", + "ja": "戴冠設定", + "en": "Set Grand" + }, + // Mode Button Labels + jp_label: { "zh-TW": "日GO", "ja": "日GO", "en": "JP Server" }, + tw_label: { "zh-TW": "台GO", "ja": "台GO", "en": "TW Server" }, + z_label: { "zh-TW": "五星自選(含3000DL)", "ja": "星5選択(3000DL含)", "en": "SSR Ticket (30M DL)" }, + // 福袋新增 + eighth_label: { "zh-TW": "[台]八週年福袋", "ja": "[台]8周年福袋", "en": "8th Anniv. GSSR" }, + nineth_label: { "zh-TW": "[台]九週年福袋", "ja": "[台]9周年福袋", "en": "9th Anniv. GSSR" }, + newyear_24_up_label: { "zh-TW": "[台]24'新年福袋(上)", "ja": "[台]24'正月福袋(上)", "en": "NY 24 GSSR (1)" }, + newyear_24_down_label: { "zh-TW": "[台]24'新年福袋(下)", "ja": "[台]24'正月福袋(下)", "en": "NY 24 GSSR (2)" }, + newyear_25_up_label: { "zh-TW": "25'新年福袋(紅上)", "ja": "25'正月福袋(赤上)", "en": "NY 25 GSSR (Red 1)" }, + newyear_25_down_label: { "zh-TW": "25'新年福袋(紅下)", "ja": "25'正月福袋(赤下)", "en": "NY 25 GSSR (Red 2)" }, + newyear_25_white_label: { "zh-TW": "25'新年福袋(白)", "ja": "25'正月福袋(白)", "en": "NY 25 GSSR (White)" }, + tenth_up_label: { "zh-TW": "十週年福袋(上三)", "ja": "10周年福袋(上三)", "en": "10th Anniv. GSSR (1)" }, + tenth_down_label: { "zh-TW": "十週年福袋(下四)", "ja": "10周年福袋(下四)", "en": "10th Anniv. GSSR (2)" }, + tenth_ex_label: { "zh-TW": "十週年福袋(EXTRA)", "ja": "10周年福袋(EXTRA)", "en": "10th Anniv. GSSR (Extra)" }, + // Canvas Dynamic Text + npLevelPrefix: { "zh-TW": "寶", "ja": "宝具", "en": "NP" }, + expectNew: { "zh-TW": "新", "ja": "新", "en": "New" }, + expectRegret: { "zh-TW": "盤", "ja": "皿", "en": "Plate" }, + expectLove: { "zh-TW": "婆", "ja": "嫁", "en": "Wife" }, + totalOwned: { "zh-TW": "英靈持有數", "ja": "サーヴァント所持数", "en": "Servants Owned" }, + ownedRate: { "zh-TW": "英靈持有率", "ja": "サーヴァント所持率", "en": "Ownership Rate" }, + totalNPLevel: { "zh-TW": "總寶數", "ja": "宝具レベル合計", "en": "Total NP Levels" }, + totalNP5Owned: { "zh-TW": "寶五持有數", "ja": "宝具5所持数", "en": "NP5 Owned" }, + ownedNP5Rate: { "zh-TW": "寶五持有率", "ja": "宝具5所持率", "en": "NP5 Rate" }, + // Alerts & Prompts + confirmImport: { + "zh-TW": "確定要匯入資料嗎?這將會覆寫目前帳號的所有持有和標記資料!此操作無法復原。", + "ja": "データをインポートしますか?現在のアカウントのすべての所持データとマークが上書きされます!この操作は元に戻せません。", + "en": "Are you sure you want to import data? This will overwrite all servant data and marks for the current account! This action cannot be undone." + }, + errorImport: { + "zh-TW": "檔案讀取或解析失敗,請確認檔案格式是否為正確的 .json 備份檔。", + "ja": "ファイルの読み込みまたは解析に失敗しました。ファイルが正しい.jsonバックアップファイルであることを確認してください。", + "en": "Failed to read or parse the file. Please ensure it is a correct .json backup file." + }, + successImport: { + "zh-TW": "資料匯入成功!頁面將會重新整理。", + "ja": "データのインポートが成功しました!ページがリロードされます。", + "en": "Data imported successfully! The page will now reload." + }, + alertNpLimit: { + "zh-TW": "寶具等級上限已切換為: ", + "ja": "宝具レベルの上限を切り替えました: ", + "en": "NP level limit has been switched to: " + }, + confirmClearAll: { + "zh-TW": "確定要清空這個帳號的所有持有和標記資料嗎?此操作無法復原。", + "ja": "このアカウントのすべての所持データとマークをリセットしますか?この操作は元に戻せません。", + "en": "Are you sure you want to clear all servant data and marks for this account? This action cannot be undone." + }, + confirmResetMark: { + "zh-TW": "確定要清空這個帳號的所有標記嗎?", + "ja": "このアカウントのすべてのマークをリセットしますか?", + "en": "Are you sure you want to clear all marks for this account?" + }, + errorGenerateImage: { + "zh-TW": "產出圖片時發生未知錯誤:", + "ja": "画像生成中に不明なエラーが発生しました:", + "en": "An unknown error occurred while generating the image: " + }, + errorSecurity: { + "zh-TW": "錯誤:無法在本地端直接產出圖片。\n\n原因:瀏覽器基於安全考量,禁止讀取本地圖片檔案後再匯出。\n\n解決方案:請透過本地伺服器 (例如 VS Code 的 'Live Server' 擴充功能) 來瀏覽您的網頁,即可正常使用此功能。", + "ja": "エラー:ローカル環境で画像を直接生成することはできません。\n\n原因:ブラウザのセキュリティ上の理由により、ローカルファイルの読み込みとエクスポートが制限されています。\n\n解決策:ローカルサーバー(例:VS Codeの「Live Server」拡張機能)経由でページを閲覧すると、この機能が正常に動作します。", + "en": "Error: Cannot generate image directly from local file system.\n\nReason: For security reasons, browsers restrict reading local files and then exporting them.\n\nSolution: Please view this page via a local server (e.g., the 'Live Server' extension in VS Code) to use this feature correctly." + }, + loadingImages: { + "zh-TW": "圖片資源載入中... ", + "ja": "画像リソースを読み込み中... ", + "en": "Loading image assets... " + }, + howToUseNp: { + "zh-TW": "設定寶具等級: 左鍵增加,右鍵減少。 (從者為寶具0時,右鍵點擊會設為最高等級),點擊職階圖可有紅底顯示。\n黃框代表120等,藍框代表戴冠,靛藍框代表120等且戴冠。", + "ja": "宝具レベル設定: 左クリックで増加、右クリックで減少します。(宝具Lv.0の場合、右クリックで最大レベルに設定されます)。クラスアイコンをクリックすると赤背景が表示されます。\n黄色の枠はLv120、青色の枠は戴冠、藍色の枠はLv120かつ戴冠を表します。", + "en": "Set NP Level: Left-click to increase, right-click to decrease. (If NP0, right-click sets to max level). Click class icon to show red background.\nYellow border indicates Lv 120, blue border indicates Grand, indigo border indicates both Lv 120 and Grand." + }, + latestUpdate: { + "zh-TW": "最近更新: 新增120等、戴冠標記框框功能", + "ja": "最近の更新: Lv120と戴冠マーク機能を追加", + "en": "Recent Updates: Added Lv 120 and Grand Mark features" + }, + svt_2025_label: { + "zh-TW": "2025年從者", + "ja": "2025年サーヴァント", + "en": "2025 Servants" + }, + newyear_26_up_label: { "zh-TW": "26'新年福袋(紅上)", "ja": "26'正月福袋(赤上)", "en": "NY 26 GSSR (Red 1)" }, + newyear_26_down_label: { "zh-TW": "26'新年福袋(紅下)", "ja": "26'正月福袋(赤下)", "en": "NY 26 GSSR (Red 2)" }, + newyear_26_white_label: { "zh-TW": "26'新年福袋(白)", "ja": "26'正月福袋(白)", "en": "NY 26 GSSR (White)" } +} \ No newline at end of file diff --git a/images-mini/alterego/1.jpg b/images-mini/alterego/1.jpg deleted file mode 100644 index 8911d4c..0000000 Binary files a/images-mini/alterego/1.jpg and /dev/null differ diff --git a/images-mini/alterego/2.jpg b/images-mini/alterego/2.jpg deleted file mode 100644 index 27f7d42..0000000 Binary files a/images-mini/alterego/2.jpg and /dev/null differ diff --git a/images-mini/alterego/3.jpg b/images-mini/alterego/3.jpg deleted file mode 100644 index d62f0df..0000000 Binary files a/images-mini/alterego/3.jpg and /dev/null differ diff --git a/images-mini/alterego/4.jpg b/images-mini/alterego/4.jpg deleted file mode 100644 index 0dbb4f2..0000000 Binary files a/images-mini/alterego/4.jpg and /dev/null differ diff --git a/images-mini/alterego/5.jpg b/images-mini/alterego/5.jpg deleted file mode 100644 index f1181f7..0000000 Binary files a/images-mini/alterego/5.jpg and /dev/null differ diff --git a/images-mini/archer/1.jpg b/images-mini/archer/1.jpg deleted file mode 100644 index 338f979..0000000 Binary files a/images-mini/archer/1.jpg and /dev/null differ diff --git a/images-mini/archer/10.jpg b/images-mini/archer/10.jpg deleted file mode 100644 index 3b49501..0000000 Binary files a/images-mini/archer/10.jpg and /dev/null differ diff --git a/images-mini/archer/11.jpg b/images-mini/archer/11.jpg deleted file mode 100644 index 272711d..0000000 Binary files a/images-mini/archer/11.jpg and /dev/null differ diff --git a/images-mini/archer/2.jpg b/images-mini/archer/2.jpg deleted file mode 100644 index 997da9d..0000000 Binary files a/images-mini/archer/2.jpg and /dev/null differ diff --git a/images-mini/archer/3.jpg b/images-mini/archer/3.jpg deleted file mode 100644 index 8947c4d..0000000 Binary files a/images-mini/archer/3.jpg and /dev/null differ diff --git a/images-mini/archer/4.jpg b/images-mini/archer/4.jpg deleted file mode 100644 index 689db4c..0000000 Binary files a/images-mini/archer/4.jpg and /dev/null differ diff --git a/images-mini/archer/5.jpg b/images-mini/archer/5.jpg deleted file mode 100644 index 65bcf34..0000000 Binary files a/images-mini/archer/5.jpg and /dev/null differ diff --git a/images-mini/archer/6.jpg b/images-mini/archer/6.jpg deleted file mode 100644 index 92ceb09..0000000 Binary files a/images-mini/archer/6.jpg and /dev/null differ diff --git a/images-mini/archer/7.jpg b/images-mini/archer/7.jpg deleted file mode 100644 index 726d4af..0000000 Binary files a/images-mini/archer/7.jpg and /dev/null differ diff --git a/images-mini/archer/8.jpg b/images-mini/archer/8.jpg deleted file mode 100644 index ea7dc5a..0000000 Binary files a/images-mini/archer/8.jpg and /dev/null differ diff --git a/images-mini/archer/9.jpg b/images-mini/archer/9.jpg deleted file mode 100644 index 9ade71e..0000000 Binary files a/images-mini/archer/9.jpg and /dev/null differ diff --git a/images-mini/assassin/1.jpg b/images-mini/assassin/1.jpg deleted file mode 100644 index c7da235..0000000 Binary files a/images-mini/assassin/1.jpg and /dev/null differ diff --git a/images-mini/assassin/2.jpg b/images-mini/assassin/2.jpg deleted file mode 100644 index cb3418a..0000000 Binary files a/images-mini/assassin/2.jpg and /dev/null differ diff --git a/images-mini/assassin/3.jpg b/images-mini/assassin/3.jpg deleted file mode 100644 index c7108f3..0000000 Binary files a/images-mini/assassin/3.jpg and /dev/null differ diff --git a/images-mini/assassin/4.jpg b/images-mini/assassin/4.jpg deleted file mode 100644 index 9a160fc..0000000 Binary files a/images-mini/assassin/4.jpg and /dev/null differ diff --git a/images-mini/assassin/5.jpg b/images-mini/assassin/5.jpg deleted file mode 100644 index 20a1895..0000000 Binary files a/images-mini/assassin/5.jpg and /dev/null differ diff --git a/images-mini/assassin/6.jpg b/images-mini/assassin/6.jpg deleted file mode 100644 index b716088..0000000 Binary files a/images-mini/assassin/6.jpg and /dev/null differ diff --git a/images-mini/assassin/7.jpg b/images-mini/assassin/7.jpg deleted file mode 100644 index 69a3bc0..0000000 Binary files a/images-mini/assassin/7.jpg and /dev/null differ diff --git a/images-mini/assassin/8.jpg b/images-mini/assassin/8.jpg deleted file mode 100644 index a160eba..0000000 Binary files a/images-mini/assassin/8.jpg and /dev/null differ diff --git a/images-mini/assassin/9.jpg b/images-mini/assassin/9.jpg deleted file mode 100644 index 32b65b6..0000000 Binary files a/images-mini/assassin/9.jpg and /dev/null differ diff --git a/images-mini/avenger/1.jpg b/images-mini/avenger/1.jpg deleted file mode 100644 index 605d193..0000000 Binary files a/images-mini/avenger/1.jpg and /dev/null differ diff --git a/images-mini/avenger/2.jpg b/images-mini/avenger/2.jpg deleted file mode 100644 index 0c715de..0000000 Binary files a/images-mini/avenger/2.jpg and /dev/null differ diff --git a/images-mini/avenger/3.jpg b/images-mini/avenger/3.jpg deleted file mode 100644 index 30af16b..0000000 Binary files a/images-mini/avenger/3.jpg and /dev/null differ diff --git a/images-mini/avenger/4.jpg b/images-mini/avenger/4.jpg deleted file mode 100644 index cd8511c..0000000 Binary files a/images-mini/avenger/4.jpg and /dev/null differ diff --git a/images-mini/berserker/1.jpg b/images-mini/berserker/1.jpg deleted file mode 100644 index ce01d88..0000000 Binary files a/images-mini/berserker/1.jpg and /dev/null differ diff --git a/images-mini/berserker/10.jpg b/images-mini/berserker/10.jpg deleted file mode 100644 index 2e29a27..0000000 Binary files a/images-mini/berserker/10.jpg and /dev/null differ diff --git a/images-mini/berserker/2.jpg b/images-mini/berserker/2.jpg deleted file mode 100644 index 708d7d0..0000000 Binary files a/images-mini/berserker/2.jpg and /dev/null differ diff --git a/images-mini/berserker/3.jpg b/images-mini/berserker/3.jpg deleted file mode 100644 index 8629fd3..0000000 Binary files a/images-mini/berserker/3.jpg and /dev/null differ diff --git a/images-mini/berserker/4.jpg b/images-mini/berserker/4.jpg deleted file mode 100644 index 6492ca4..0000000 Binary files a/images-mini/berserker/4.jpg and /dev/null differ diff --git a/images-mini/berserker/5.jpg b/images-mini/berserker/5.jpg deleted file mode 100644 index 6575c28..0000000 Binary files a/images-mini/berserker/5.jpg and /dev/null differ diff --git a/images-mini/berserker/6.jpg b/images-mini/berserker/6.jpg deleted file mode 100644 index 06bdbf1..0000000 Binary files a/images-mini/berserker/6.jpg and /dev/null differ diff --git a/images-mini/berserker/7.jpg b/images-mini/berserker/7.jpg deleted file mode 100644 index ffa5ae3..0000000 Binary files a/images-mini/berserker/7.jpg and /dev/null differ diff --git a/images-mini/berserker/8.jpg b/images-mini/berserker/8.jpg deleted file mode 100644 index 9383eb0..0000000 Binary files a/images-mini/berserker/8.jpg and /dev/null differ diff --git a/images-mini/berserker/9.jpg b/images-mini/berserker/9.jpg deleted file mode 100644 index 941b758..0000000 Binary files a/images-mini/berserker/9.jpg and /dev/null differ diff --git a/images-mini/caster/1.jpg b/images-mini/caster/1.jpg deleted file mode 100644 index 6d0eba4..0000000 Binary files a/images-mini/caster/1.jpg and /dev/null differ diff --git a/images-mini/caster/10.jpg b/images-mini/caster/10.jpg deleted file mode 100644 index 1d79943..0000000 Binary files a/images-mini/caster/10.jpg and /dev/null differ diff --git a/images-mini/caster/11.jpg b/images-mini/caster/11.jpg deleted file mode 100644 index eecba53..0000000 Binary files a/images-mini/caster/11.jpg and /dev/null differ diff --git a/images-mini/caster/2.jpg b/images-mini/caster/2.jpg deleted file mode 100644 index 355fe0d..0000000 Binary files a/images-mini/caster/2.jpg and /dev/null differ diff --git a/images-mini/caster/3.jpg b/images-mini/caster/3.jpg deleted file mode 100644 index 609f422..0000000 Binary files a/images-mini/caster/3.jpg and /dev/null differ diff --git a/images-mini/caster/4.jpg b/images-mini/caster/4.jpg deleted file mode 100644 index 68f6a87..0000000 Binary files a/images-mini/caster/4.jpg and /dev/null differ diff --git a/images-mini/caster/5.jpg b/images-mini/caster/5.jpg deleted file mode 100644 index ec87cc6..0000000 Binary files a/images-mini/caster/5.jpg and /dev/null differ diff --git a/images-mini/caster/6.jpg b/images-mini/caster/6.jpg deleted file mode 100644 index b8d8c37..0000000 Binary files a/images-mini/caster/6.jpg and /dev/null differ diff --git a/images-mini/caster/7.jpg b/images-mini/caster/7.jpg deleted file mode 100644 index 9f27934..0000000 Binary files a/images-mini/caster/7.jpg and /dev/null differ diff --git a/images-mini/caster/8.jpg b/images-mini/caster/8.jpg deleted file mode 100644 index 1e2c7ec..0000000 Binary files a/images-mini/caster/8.jpg and /dev/null differ diff --git a/images-mini/caster/9.jpg b/images-mini/caster/9.jpg deleted file mode 100644 index 35f1e81..0000000 Binary files a/images-mini/caster/9.jpg and /dev/null differ diff --git a/images-mini/class/class_1.png b/images-mini/class/class_1.png deleted file mode 100644 index 846459e..0000000 Binary files a/images-mini/class/class_1.png and /dev/null differ diff --git a/images-mini/class/class_10.png b/images-mini/class/class_10.png deleted file mode 100644 index 18604b2..0000000 Binary files a/images-mini/class/class_10.png and /dev/null differ diff --git a/images-mini/class/class_11.png b/images-mini/class/class_11.png deleted file mode 100644 index a90d6b2..0000000 Binary files a/images-mini/class/class_11.png and /dev/null differ diff --git a/images-mini/class/class_12.png b/images-mini/class/class_12.png deleted file mode 100644 index 75f5bad..0000000 Binary files a/images-mini/class/class_12.png and /dev/null differ diff --git a/images-mini/class/class_2.png b/images-mini/class/class_2.png deleted file mode 100644 index 644c27d..0000000 Binary files a/images-mini/class/class_2.png and /dev/null differ diff --git a/images-mini/class/class_3.png b/images-mini/class/class_3.png deleted file mode 100644 index 0330a00..0000000 Binary files a/images-mini/class/class_3.png and /dev/null differ diff --git a/images-mini/class/class_4.png b/images-mini/class/class_4.png deleted file mode 100644 index 766e8d8..0000000 Binary files a/images-mini/class/class_4.png and /dev/null differ diff --git a/images-mini/class/class_5.png b/images-mini/class/class_5.png deleted file mode 100644 index 38b507a..0000000 Binary files a/images-mini/class/class_5.png and /dev/null differ diff --git a/images-mini/class/class_6.png b/images-mini/class/class_6.png deleted file mode 100644 index 199e951..0000000 Binary files a/images-mini/class/class_6.png and /dev/null differ diff --git a/images-mini/class/class_7.png b/images-mini/class/class_7.png deleted file mode 100644 index d64adc3..0000000 Binary files a/images-mini/class/class_7.png and /dev/null differ diff --git a/images-mini/class/class_8.png b/images-mini/class/class_8.png deleted file mode 100644 index 4b11e81..0000000 Binary files a/images-mini/class/class_8.png and /dev/null differ diff --git a/images-mini/class/class_9.png b/images-mini/class/class_9.png deleted file mode 100644 index 7d6e789..0000000 Binary files a/images-mini/class/class_9.png and /dev/null differ diff --git a/images-mini/foreigner/1.jpg b/images-mini/foreigner/1.jpg deleted file mode 100644 index b5545ce..0000000 Binary files a/images-mini/foreigner/1.jpg and /dev/null differ diff --git a/images-mini/foreigner/2.jpg b/images-mini/foreigner/2.jpg deleted file mode 100644 index a061274..0000000 Binary files a/images-mini/foreigner/2.jpg and /dev/null differ diff --git a/images-mini/foreigner/3.jpg b/images-mini/foreigner/3.jpg deleted file mode 100644 index 9acd30e..0000000 Binary files a/images-mini/foreigner/3.jpg and /dev/null differ diff --git a/images-mini/lancer/1.jpg b/images-mini/lancer/1.jpg deleted file mode 100644 index 65fe973..0000000 Binary files a/images-mini/lancer/1.jpg and /dev/null differ diff --git a/images-mini/lancer/2.jpg b/images-mini/lancer/2.jpg deleted file mode 100644 index 24a0f11..0000000 Binary files a/images-mini/lancer/2.jpg and /dev/null differ diff --git a/images-mini/lancer/3.jpg b/images-mini/lancer/3.jpg deleted file mode 100644 index 472cea9..0000000 Binary files a/images-mini/lancer/3.jpg and /dev/null differ diff --git a/images-mini/lancer/4.jpg b/images-mini/lancer/4.jpg deleted file mode 100644 index 33ffd22..0000000 Binary files a/images-mini/lancer/4.jpg and /dev/null differ diff --git a/images-mini/lancer/5.jpg b/images-mini/lancer/5.jpg deleted file mode 100644 index eb09c1b..0000000 Binary files a/images-mini/lancer/5.jpg and /dev/null differ diff --git a/images-mini/lancer/6.jpg b/images-mini/lancer/6.jpg deleted file mode 100644 index 2e1337c..0000000 Binary files a/images-mini/lancer/6.jpg and /dev/null differ diff --git a/images-mini/lancer/7.jpg b/images-mini/lancer/7.jpg deleted file mode 100644 index 77001b5..0000000 Binary files a/images-mini/lancer/7.jpg and /dev/null differ diff --git a/images-mini/lancer/8.jpg b/images-mini/lancer/8.jpg deleted file mode 100644 index 1ccd58b..0000000 Binary files a/images-mini/lancer/8.jpg and /dev/null differ diff --git a/images-mini/lancer/9.jpg b/images-mini/lancer/9.jpg deleted file mode 100644 index 78e1851..0000000 Binary files a/images-mini/lancer/9.jpg and /dev/null differ diff --git a/images-mini/mooncancer/1.jpg b/images-mini/mooncancer/1.jpg deleted file mode 100644 index 45f1289..0000000 Binary files a/images-mini/mooncancer/1.jpg and /dev/null differ diff --git a/images-mini/mooncancer/2.jpg b/images-mini/mooncancer/2.jpg deleted file mode 100644 index 6d36f8d..0000000 Binary files a/images-mini/mooncancer/2.jpg and /dev/null differ diff --git a/images-mini/rider/1.jpg b/images-mini/rider/1.jpg deleted file mode 100644 index 443b8fa..0000000 Binary files a/images-mini/rider/1.jpg and /dev/null differ diff --git a/images-mini/rider/10.jpg b/images-mini/rider/10.jpg deleted file mode 100644 index 523cdc1..0000000 Binary files a/images-mini/rider/10.jpg and /dev/null differ diff --git a/images-mini/rider/11.jpg b/images-mini/rider/11.jpg deleted file mode 100644 index 257523b..0000000 Binary files a/images-mini/rider/11.jpg and /dev/null differ diff --git a/images-mini/rider/12.jpg b/images-mini/rider/12.jpg deleted file mode 100644 index 83c8f43..0000000 Binary files a/images-mini/rider/12.jpg and /dev/null differ diff --git a/images-mini/rider/2.jpg b/images-mini/rider/2.jpg deleted file mode 100644 index 2c3f444..0000000 Binary files a/images-mini/rider/2.jpg and /dev/null differ diff --git a/images-mini/rider/3.jpg b/images-mini/rider/3.jpg deleted file mode 100644 index 3dcc224..0000000 Binary files a/images-mini/rider/3.jpg and /dev/null differ diff --git a/images-mini/rider/4.jpg b/images-mini/rider/4.jpg deleted file mode 100644 index 5e58b60..0000000 Binary files a/images-mini/rider/4.jpg and /dev/null differ diff --git a/images-mini/rider/5.jpg b/images-mini/rider/5.jpg deleted file mode 100644 index 340706d..0000000 Binary files a/images-mini/rider/5.jpg and /dev/null differ diff --git a/images-mini/rider/6.jpg b/images-mini/rider/6.jpg deleted file mode 100644 index bba0669..0000000 Binary files a/images-mini/rider/6.jpg and /dev/null differ diff --git a/images-mini/rider/7.jpg b/images-mini/rider/7.jpg deleted file mode 100644 index 218d38b..0000000 Binary files a/images-mini/rider/7.jpg and /dev/null differ diff --git a/images-mini/rider/8.jpg b/images-mini/rider/8.jpg deleted file mode 100644 index d0ee9da..0000000 Binary files a/images-mini/rider/8.jpg and /dev/null differ diff --git a/images-mini/rider/9.jpg b/images-mini/rider/9.jpg deleted file mode 100644 index 04bd30a..0000000 Binary files a/images-mini/rider/9.jpg and /dev/null differ diff --git a/images-mini/ruler/1.jpg b/images-mini/ruler/1.jpg deleted file mode 100644 index b5d22ed..0000000 Binary files a/images-mini/ruler/1.jpg and /dev/null differ diff --git a/images-mini/ruler/2.jpg b/images-mini/ruler/2.jpg deleted file mode 100644 index 7cc7a54..0000000 Binary files a/images-mini/ruler/2.jpg and /dev/null differ diff --git a/images-mini/ruler/3.jpg b/images-mini/ruler/3.jpg deleted file mode 100644 index 9ab967d..0000000 Binary files a/images-mini/ruler/3.jpg and /dev/null differ diff --git a/images-mini/ruler/4.jpg b/images-mini/ruler/4.jpg deleted file mode 100644 index 0fb59fa..0000000 Binary files a/images-mini/ruler/4.jpg and /dev/null differ diff --git a/images-mini/ruler/5.jpg b/images-mini/ruler/5.jpg deleted file mode 100644 index 74ac2ad..0000000 Binary files a/images-mini/ruler/5.jpg and /dev/null differ diff --git a/images-mini/saber/1.jpg b/images-mini/saber/1.jpg deleted file mode 100644 index c31bd0a..0000000 Binary files a/images-mini/saber/1.jpg and /dev/null differ diff --git a/images-mini/saber/10.jpg b/images-mini/saber/10.jpg deleted file mode 100644 index 72ba149..0000000 Binary files a/images-mini/saber/10.jpg and /dev/null differ diff --git a/images-mini/saber/11.jpg b/images-mini/saber/11.jpg deleted file mode 100644 index ad0d16f..0000000 Binary files a/images-mini/saber/11.jpg and /dev/null differ diff --git a/images-mini/saber/12.jpg b/images-mini/saber/12.jpg deleted file mode 100644 index 081803d..0000000 Binary files a/images-mini/saber/12.jpg and /dev/null differ diff --git a/images-mini/saber/2.jpg b/images-mini/saber/2.jpg deleted file mode 100644 index f2ca33f..0000000 Binary files a/images-mini/saber/2.jpg and /dev/null differ diff --git a/images-mini/saber/3.jpg b/images-mini/saber/3.jpg deleted file mode 100644 index fc4bcfb..0000000 Binary files a/images-mini/saber/3.jpg and /dev/null differ diff --git a/images-mini/saber/4.jpg b/images-mini/saber/4.jpg deleted file mode 100644 index 54ccd2f..0000000 Binary files a/images-mini/saber/4.jpg and /dev/null differ diff --git a/images-mini/saber/5.jpg b/images-mini/saber/5.jpg deleted file mode 100644 index 62e9039..0000000 Binary files a/images-mini/saber/5.jpg and /dev/null differ diff --git a/images-mini/saber/6.jpg b/images-mini/saber/6.jpg deleted file mode 100644 index b2f868c..0000000 Binary files a/images-mini/saber/6.jpg and /dev/null differ diff --git a/images-mini/saber/7.jpg b/images-mini/saber/7.jpg deleted file mode 100644 index d5188f9..0000000 Binary files a/images-mini/saber/7.jpg and /dev/null differ diff --git a/images-mini/saber/8.jpg b/images-mini/saber/8.jpg deleted file mode 100644 index 9a4fb91..0000000 Binary files a/images-mini/saber/8.jpg and /dev/null differ diff --git a/images-mini/saber/9.jpg b/images-mini/saber/9.jpg deleted file mode 100644 index 7395c35..0000000 Binary files a/images-mini/saber/9.jpg and /dev/null differ diff --git a/images/alterego/1.png b/images/alterego/1.png deleted file mode 100644 index 4269488..0000000 Binary files a/images/alterego/1.png and /dev/null differ diff --git a/images/alterego/1.png.jpg b/images/alterego/1.png.jpg deleted file mode 100644 index f284480..0000000 Binary files a/images/alterego/1.png.jpg and /dev/null differ diff --git a/images/alterego/2.png b/images/alterego/2.png deleted file mode 100644 index 403db28..0000000 Binary files a/images/alterego/2.png and /dev/null differ diff --git a/images/alterego/2.png.jpg b/images/alterego/2.png.jpg deleted file mode 100644 index 16c08a4..0000000 Binary files a/images/alterego/2.png.jpg and /dev/null differ diff --git a/images/alterego/3.png b/images/alterego/3.png deleted file mode 100644 index 21109d9..0000000 Binary files a/images/alterego/3.png and /dev/null differ diff --git a/images/alterego/3.png.jpg b/images/alterego/3.png.jpg deleted file mode 100644 index c1669c0..0000000 Binary files a/images/alterego/3.png.jpg and /dev/null differ diff --git a/images/archer/1.png b/images/archer/1.png deleted file mode 100644 index 75a75cb..0000000 Binary files a/images/archer/1.png and /dev/null differ diff --git a/images/archer/1.png.jpg b/images/archer/1.png.jpg deleted file mode 100644 index a0b92ec..0000000 Binary files a/images/archer/1.png.jpg and /dev/null differ diff --git a/images/archer/2.png b/images/archer/2.png deleted file mode 100644 index 5ab061d..0000000 Binary files a/images/archer/2.png and /dev/null differ diff --git a/images/archer/2.png.jpg b/images/archer/2.png.jpg deleted file mode 100644 index 0e2c300..0000000 Binary files a/images/archer/2.png.jpg and /dev/null differ diff --git a/images/archer/3.png b/images/archer/3.png deleted file mode 100644 index 5be09d6..0000000 Binary files a/images/archer/3.png and /dev/null differ diff --git a/images/archer/3.png.jpg b/images/archer/3.png.jpg deleted file mode 100644 index 20dd752..0000000 Binary files a/images/archer/3.png.jpg and /dev/null differ diff --git a/images/archer/4.png b/images/archer/4.png deleted file mode 100644 index f61d404..0000000 Binary files a/images/archer/4.png and /dev/null differ diff --git a/images/archer/4.png.jpg b/images/archer/4.png.jpg deleted file mode 100644 index f2f732a..0000000 Binary files a/images/archer/4.png.jpg and /dev/null differ diff --git a/images/archer/5.png b/images/archer/5.png deleted file mode 100644 index 21ad325..0000000 Binary files a/images/archer/5.png and /dev/null differ diff --git a/images/archer/5.png.jpg b/images/archer/5.png.jpg deleted file mode 100644 index b5a4c8f..0000000 Binary files a/images/archer/5.png.jpg and /dev/null differ diff --git a/images/archer/6.png b/images/archer/6.png deleted file mode 100644 index e573481..0000000 Binary files a/images/archer/6.png and /dev/null differ diff --git a/images/archer/6.png.jpg b/images/archer/6.png.jpg deleted file mode 100644 index 075ec59..0000000 Binary files a/images/archer/6.png.jpg and /dev/null differ diff --git a/images/archer/7.png b/images/archer/7.png deleted file mode 100644 index e91d904..0000000 Binary files a/images/archer/7.png and /dev/null differ diff --git a/images/archer/7.png.jpg b/images/archer/7.png.jpg deleted file mode 100644 index 8bc12b8..0000000 Binary files a/images/archer/7.png.jpg and /dev/null differ diff --git a/images/archer/8.png b/images/archer/8.png deleted file mode 100644 index ee2eabf..0000000 Binary files a/images/archer/8.png and /dev/null differ diff --git a/images/archer/8.png.jpg b/images/archer/8.png.jpg deleted file mode 100644 index 1325d9b..0000000 Binary files a/images/archer/8.png.jpg and /dev/null differ diff --git a/images/assassin/1.png b/images/assassin/1.png deleted file mode 100644 index d25d999..0000000 Binary files a/images/assassin/1.png and /dev/null differ diff --git a/images/assassin/1.png.jpg b/images/assassin/1.png.jpg deleted file mode 100644 index 727f0ec..0000000 Binary files a/images/assassin/1.png.jpg and /dev/null differ diff --git a/images/assassin/2.png b/images/assassin/2.png deleted file mode 100644 index 517de6a..0000000 Binary files a/images/assassin/2.png and /dev/null differ diff --git a/images/assassin/2.png.jpg b/images/assassin/2.png.jpg deleted file mode 100644 index 01b871f..0000000 Binary files a/images/assassin/2.png.jpg and /dev/null differ diff --git a/images/assassin/3.png b/images/assassin/3.png deleted file mode 100644 index 35f31cf..0000000 Binary files a/images/assassin/3.png and /dev/null differ diff --git a/images/assassin/3.png.jpg b/images/assassin/3.png.jpg deleted file mode 100644 index 8662cea..0000000 Binary files a/images/assassin/3.png.jpg and /dev/null differ diff --git a/images/assassin/4.png b/images/assassin/4.png deleted file mode 100644 index 014d45a..0000000 Binary files a/images/assassin/4.png and /dev/null differ diff --git a/images/assassin/4.png.jpg b/images/assassin/4.png.jpg deleted file mode 100644 index 4ec1a5d..0000000 Binary files a/images/assassin/4.png.jpg and /dev/null differ diff --git a/images/assassin/5.png b/images/assassin/5.png deleted file mode 100644 index 76c10be..0000000 Binary files a/images/assassin/5.png and /dev/null differ diff --git a/images/assassin/5.png.jpg b/images/assassin/5.png.jpg deleted file mode 100644 index 89aeae6..0000000 Binary files a/images/assassin/5.png.jpg and /dev/null differ diff --git a/images/assassin/6.png b/images/assassin/6.png deleted file mode 100644 index e9d5ed4..0000000 Binary files a/images/assassin/6.png and /dev/null differ diff --git a/images/assassin/6.png.jpg b/images/assassin/6.png.jpg deleted file mode 100644 index 58bbd42..0000000 Binary files a/images/assassin/6.png.jpg and /dev/null differ diff --git a/images/assassin/7.png b/images/assassin/7.png deleted file mode 100644 index 45234c3..0000000 Binary files a/images/assassin/7.png and /dev/null differ diff --git a/images/assassin/7.png.jpg b/images/assassin/7.png.jpg deleted file mode 100644 index 44a6ed4..0000000 Binary files a/images/assassin/7.png.jpg and /dev/null differ diff --git a/images/avenger/1.png b/images/avenger/1.png deleted file mode 100644 index 82892dc..0000000 Binary files a/images/avenger/1.png and /dev/null differ diff --git a/images/avenger/2.png b/images/avenger/2.png deleted file mode 100644 index b038b39..0000000 Binary files a/images/avenger/2.png and /dev/null differ diff --git a/images/berserker/1.png b/images/berserker/1.png deleted file mode 100644 index 741d2d9..0000000 Binary files a/images/berserker/1.png and /dev/null differ diff --git a/images/berserker/2.png b/images/berserker/2.png deleted file mode 100644 index b153dae..0000000 Binary files a/images/berserker/2.png and /dev/null differ diff --git a/images/berserker/3.png b/images/berserker/3.png deleted file mode 100644 index be1b87e..0000000 Binary files a/images/berserker/3.png and /dev/null differ diff --git a/images/berserker/4.png b/images/berserker/4.png deleted file mode 100644 index 82e3b92..0000000 Binary files a/images/berserker/4.png and /dev/null differ diff --git a/images/berserker/5.png b/images/berserker/5.png deleted file mode 100644 index 18e17c7..0000000 Binary files a/images/berserker/5.png and /dev/null differ diff --git a/images/berserker/6.png b/images/berserker/6.png deleted file mode 100644 index 1411f76..0000000 Binary files a/images/berserker/6.png and /dev/null differ diff --git a/images/berserker/7.png b/images/berserker/7.png deleted file mode 100644 index c23542f..0000000 Binary files a/images/berserker/7.png and /dev/null differ diff --git a/images/caster/1.png b/images/caster/1.png deleted file mode 100644 index b09f857..0000000 Binary files a/images/caster/1.png and /dev/null differ diff --git a/images/caster/2.png b/images/caster/2.png deleted file mode 100644 index c1cd8a0..0000000 Binary files a/images/caster/2.png and /dev/null differ diff --git a/images/caster/3.png b/images/caster/3.png deleted file mode 100644 index d4ebcfb..0000000 Binary files a/images/caster/3.png and /dev/null differ diff --git a/images/caster/4.png b/images/caster/4.png deleted file mode 100644 index 91e78c7..0000000 Binary files a/images/caster/4.png and /dev/null differ diff --git a/images/caster/5.png b/images/caster/5.png deleted file mode 100644 index f457fa8..0000000 Binary files a/images/caster/5.png and /dev/null differ diff --git a/images/caster/6.png b/images/caster/6.png deleted file mode 100644 index 4882e25..0000000 Binary files a/images/caster/6.png and /dev/null differ diff --git a/images/caster/7.png b/images/caster/7.png deleted file mode 100644 index 97505e4..0000000 Binary files a/images/caster/7.png and /dev/null differ diff --git a/images/caster/8.png b/images/caster/8.png deleted file mode 100644 index 16abfdd..0000000 Binary files a/images/caster/8.png and /dev/null differ diff --git a/images/caster/9.png b/images/caster/9.png deleted file mode 100644 index b88ca2e..0000000 Binary files a/images/caster/9.png and /dev/null differ diff --git a/images/class/8th.png b/images/class/8th.png new file mode 100644 index 0000000..f79e3d5 Binary files /dev/null and b/images/class/8th.png differ diff --git a/images/class/class3_33.png b/images/class/class3_33.png new file mode 100644 index 0000000..7c0b596 Binary files /dev/null and b/images/class/class3_33.png differ diff --git a/images-mini/class/class_1.jpg b/images/class/class_1.jpg similarity index 100% rename from images-mini/class/class_1.jpg rename to images/class/class_1.jpg diff --git a/images/class/class_1.png b/images/class/class_1.png index e0fee9f..846459e 100644 Binary files a/images/class/class_1.png and b/images/class/class_1.png differ diff --git a/images-mini/class/class_10.jpg b/images/class/class_10.jpg similarity index 100% rename from images-mini/class/class_10.jpg rename to images/class/class_10.jpg diff --git a/images/class/class_10.png b/images/class/class_10.png index f40213f..18604b2 100644 Binary files a/images/class/class_10.png and b/images/class/class_10.png differ diff --git a/images/class/class_1001.png b/images/class/class_1001.png new file mode 100644 index 0000000..eee7069 Binary files /dev/null and b/images/class/class_1001.png differ diff --git a/images/class/class_1002.png b/images/class/class_1002.png new file mode 100644 index 0000000..9b58e52 Binary files /dev/null and b/images/class/class_1002.png differ diff --git a/images/class/class_1004.png b/images/class/class_1004.png new file mode 100644 index 0000000..a96ca6c Binary files /dev/null and b/images/class/class_1004.png differ diff --git a/images/class/class_1005.png b/images/class/class_1005.png new file mode 100644 index 0000000..6ecc704 Binary files /dev/null and b/images/class/class_1005.png differ diff --git a/images-mini/class/class_11.jpg b/images/class/class_11.jpg similarity index 100% rename from images-mini/class/class_11.jpg rename to images/class/class_11.jpg diff --git a/images/class/class_11.png b/images/class/class_11.png index 781016f..a90d6b2 100644 Binary files a/images/class/class_11.png and b/images/class/class_11.png differ diff --git a/images-mini/class/class_12.jpg b/images/class/class_12.jpg similarity index 100% rename from images-mini/class/class_12.jpg rename to images/class/class_12.jpg diff --git a/images/class/class_12.png b/images/class/class_12.png index 498fdd1..75f5bad 100644 Binary files a/images/class/class_12.png and b/images/class/class_12.png differ diff --git a/images/class/class_13.jpg b/images/class/class_13.jpg new file mode 100644 index 0000000..33c2051 Binary files /dev/null and b/images/class/class_13.jpg differ diff --git a/images/class/class_13.png b/images/class/class_13.png new file mode 100644 index 0000000..0ec709f Binary files /dev/null and b/images/class/class_13.png differ diff --git a/images/class/class_14.png b/images/class/class_14.png new file mode 100644 index 0000000..aca2315 Binary files /dev/null and b/images/class/class_14.png differ diff --git a/images/class/class_15.png b/images/class/class_15.png new file mode 100644 index 0000000..f9d30b8 Binary files /dev/null and b/images/class/class_15.png differ diff --git a/images-mini/class/class_99.png b/images/class/class_19.png similarity index 100% rename from images-mini/class/class_99.png rename to images/class/class_19.png diff --git a/images-mini/class/class_2.jpg b/images/class/class_2.jpg similarity index 100% rename from images-mini/class/class_2.jpg rename to images/class/class_2.jpg diff --git a/images/class/class_2.png b/images/class/class_2.png index ceb0d33..644c27d 100644 Binary files a/images/class/class_2.png and b/images/class/class_2.png differ diff --git a/images-mini/class/class_3.jpg b/images/class/class_3.jpg similarity index 100% rename from images-mini/class/class_3.jpg rename to images/class/class_3.jpg diff --git a/images/class/class_3.png b/images/class/class_3.png index ed88c08..0330a00 100644 Binary files a/images/class/class_3.png and b/images/class/class_3.png differ diff --git a/images-mini/class/class_4.jpg b/images/class/class_4.jpg similarity index 100% rename from images-mini/class/class_4.jpg rename to images/class/class_4.jpg diff --git a/images/class/class_4.png b/images/class/class_4.png index 0ea1e58..766e8d8 100644 Binary files a/images/class/class_4.png and b/images/class/class_4.png differ diff --git a/images-mini/class/class_5.jpg b/images/class/class_5.jpg similarity index 100% rename from images-mini/class/class_5.jpg rename to images/class/class_5.jpg diff --git a/images/class/class_5.png b/images/class/class_5.png index a0d2047..38b507a 100644 Binary files a/images/class/class_5.png and b/images/class/class_5.png differ diff --git a/images-mini/class/class_6.jpg b/images/class/class_6.jpg similarity index 100% rename from images-mini/class/class_6.jpg rename to images/class/class_6.jpg diff --git a/images/class/class_6.png b/images/class/class_6.png index 765606e..199e951 100644 Binary files a/images/class/class_6.png and b/images/class/class_6.png differ diff --git a/images/class/class_666.png b/images/class/class_666.png new file mode 100644 index 0000000..163fcf1 Binary files /dev/null and b/images/class/class_666.png differ diff --git a/images-mini/class/class_7.jpg b/images/class/class_7.jpg similarity index 100% rename from images-mini/class/class_7.jpg rename to images/class/class_7.jpg diff --git a/images/class/class_7.png b/images/class/class_7.png index 3bd3172..d64adc3 100644 Binary files a/images/class/class_7.png and b/images/class/class_7.png differ diff --git a/images-mini/class/class_8.jpg b/images/class/class_8.jpg similarity index 100% rename from images-mini/class/class_8.jpg rename to images/class/class_8.jpg diff --git a/images/class/class_8.png b/images/class/class_8.png index 9645b28..4b11e81 100644 Binary files a/images/class/class_8.png and b/images/class/class_8.png differ diff --git a/images/class/class_888.png b/images/class/class_888.png new file mode 100644 index 0000000..346d38b Binary files /dev/null and b/images/class/class_888.png differ diff --git a/images-mini/class/class_9.jpg b/images/class/class_9.jpg similarity index 100% rename from images-mini/class/class_9.jpg rename to images/class/class_9.jpg diff --git a/images/class/class_9.png b/images/class/class_9.png index 51cd099..7d6e789 100644 Binary files a/images/class/class_9.png and b/images/class/class_9.png differ diff --git a/images-mini/class/class_99.jpg b/images/class/class_99.jpg similarity index 100% rename from images-mini/class/class_99.jpg rename to images/class/class_99.jpg diff --git a/images/class/class_99.png b/images/class/class_99.png index 0a0c6ec..526de56 100644 Binary files a/images/class/class_99.png and b/images/class/class_99.png differ diff --git a/images/class/classes/class3_1004.png b/images/class/classes/class3_1004.png new file mode 100644 index 0000000..b757228 Binary files /dev/null and b/images/class/classes/class3_1004.png differ diff --git a/images/class/classes/class3_1005.png b/images/class/classes/class3_1005.png new file mode 100644 index 0000000..5a20e7a Binary files /dev/null and b/images/class/classes/class3_1005.png differ diff --git a/images/class/classes/class3_32.png b/images/class/classes/class3_32.png new file mode 100644 index 0000000..7b39310 Binary files /dev/null and b/images/class/classes/class3_32.png differ diff --git a/images/class/classes/class3_40.png b/images/class/classes/class3_40.png new file mode 100644 index 0000000..734252d Binary files /dev/null and b/images/class/classes/class3_40.png differ diff --git a/images/class/classes/class_1.png b/images/class/classes/class_1.png new file mode 100644 index 0000000..18a1e2c Binary files /dev/null and b/images/class/classes/class_1.png differ diff --git a/images/class/classes/class_10.png b/images/class/classes/class_10.png new file mode 100644 index 0000000..42cd6f8 Binary files /dev/null and b/images/class/classes/class_10.png differ diff --git a/images/class/classes/class_1001.png b/images/class/classes/class_1001.png new file mode 100644 index 0000000..03e3b85 Binary files /dev/null and b/images/class/classes/class_1001.png differ diff --git a/images/class/classes/class_1002.png b/images/class/classes/class_1002.png new file mode 100644 index 0000000..4384254 Binary files /dev/null and b/images/class/classes/class_1002.png differ diff --git a/images/class/classes/class_11.png b/images/class/classes/class_11.png new file mode 100644 index 0000000..8110086 Binary files /dev/null and b/images/class/classes/class_11.png differ diff --git a/images/class/classes/class_12.png b/images/class/classes/class_12.png new file mode 100644 index 0000000..77af80a Binary files /dev/null and b/images/class/classes/class_12.png differ diff --git a/images/class/classes/class_2.png b/images/class/classes/class_2.png new file mode 100644 index 0000000..b5593f7 Binary files /dev/null and b/images/class/classes/class_2.png differ diff --git a/images/class/classes/class_23.png b/images/class/classes/class_23.png new file mode 100644 index 0000000..883857c Binary files /dev/null and b/images/class/classes/class_23.png differ diff --git a/images/class/classes/class_25.png b/images/class/classes/class_25.png new file mode 100644 index 0000000..92e51b8 Binary files /dev/null and b/images/class/classes/class_25.png differ diff --git a/images/class/classes/class_28.png b/images/class/classes/class_28.png new file mode 100644 index 0000000..98ed149 Binary files /dev/null and b/images/class/classes/class_28.png differ diff --git a/images/class/classes/class_3.png b/images/class/classes/class_3.png new file mode 100644 index 0000000..a00ec06 Binary files /dev/null and b/images/class/classes/class_3.png differ diff --git a/images/class/classes/class_4.png b/images/class/classes/class_4.png new file mode 100644 index 0000000..eae5c3f Binary files /dev/null and b/images/class/classes/class_4.png differ diff --git a/images/class/classes/class_5.png b/images/class/classes/class_5.png new file mode 100644 index 0000000..d350729 Binary files /dev/null and b/images/class/classes/class_5.png differ diff --git a/images/class/classes/class_6.png b/images/class/classes/class_6.png new file mode 100644 index 0000000..1998c2f Binary files /dev/null and b/images/class/classes/class_6.png differ diff --git a/images/class/classes/class_7.png b/images/class/classes/class_7.png new file mode 100644 index 0000000..70c9375 Binary files /dev/null and b/images/class/classes/class_7.png differ diff --git a/images/class/classes/class_8.png b/images/class/classes/class_8.png new file mode 100644 index 0000000..8db559e Binary files /dev/null and b/images/class/classes/class_8.png differ diff --git a/images/class/classes/class_9.png b/images/class/classes/class_9.png new file mode 100644 index 0000000..983a4c4 Binary files /dev/null and b/images/class/classes/class_9.png differ diff --git a/images/class/lucky_origin.png b/images/class/lucky_origin.png new file mode 100644 index 0000000..d738dd7 Binary files /dev/null and b/images/class/lucky_origin.png differ diff --git a/images/class/seventh.png b/images/class/seventh.png new file mode 100644 index 0000000..e0fe2fc Binary files /dev/null and b/images/class/seventh.png differ diff --git a/images/class/sixth.png b/images/class/sixth.png new file mode 100644 index 0000000..8d2a937 Binary files /dev/null and b/images/class/sixth.png differ diff --git a/images/foreigner/1.png b/images/foreigner/1.png deleted file mode 100644 index b26bce3..0000000 Binary files a/images/foreigner/1.png and /dev/null differ diff --git a/images/foreigner/2.png b/images/foreigner/2.png deleted file mode 100644 index 29a6f36..0000000 Binary files a/images/foreigner/2.png and /dev/null differ diff --git a/images/lancer/1.png b/images/lancer/1.png deleted file mode 100644 index 709a3af..0000000 Binary files a/images/lancer/1.png and /dev/null differ diff --git a/images/lancer/2.png b/images/lancer/2.png deleted file mode 100644 index 8b9ec0b..0000000 Binary files a/images/lancer/2.png and /dev/null differ diff --git a/images/lancer/3.png b/images/lancer/3.png deleted file mode 100644 index 8b27129..0000000 Binary files a/images/lancer/3.png and /dev/null differ diff --git a/images/lancer/4.png b/images/lancer/4.png deleted file mode 100644 index e044ea9..0000000 Binary files a/images/lancer/4.png and /dev/null differ diff --git a/images/lancer/5.png b/images/lancer/5.png deleted file mode 100644 index a3b9826..0000000 Binary files a/images/lancer/5.png and /dev/null differ diff --git a/images/lancer/6.png b/images/lancer/6.png deleted file mode 100644 index b1f7afe..0000000 Binary files a/images/lancer/6.png and /dev/null differ diff --git a/images/lancer/7.png b/images/lancer/7.png deleted file mode 100644 index fbdef86..0000000 Binary files a/images/lancer/7.png and /dev/null differ diff --git a/images-mini/mark/heart.png b/images/mark/heart.png similarity index 100% rename from images-mini/mark/heart.png rename to images/mark/heart.png diff --git a/images-mini/mark/hiclipart.png b/images/mark/hiclipart.png similarity index 100% rename from images-mini/mark/hiclipart.png rename to images/mark/hiclipart.png diff --git a/images/mark/kizuna.png b/images/mark/kizuna.png new file mode 100644 index 0000000..58577ec Binary files /dev/null and b/images/mark/kizuna.png differ diff --git a/images/rider/1.png b/images/rider/1.png deleted file mode 100644 index 897f902..0000000 Binary files a/images/rider/1.png and /dev/null differ diff --git a/images/rider/2.png b/images/rider/2.png deleted file mode 100644 index 742584d..0000000 Binary files a/images/rider/2.png and /dev/null differ diff --git a/images/rider/3.png b/images/rider/3.png deleted file mode 100644 index e66c562..0000000 Binary files a/images/rider/3.png and /dev/null differ diff --git a/images/rider/4.png b/images/rider/4.png deleted file mode 100644 index 12805b3..0000000 Binary files a/images/rider/4.png and /dev/null differ diff --git a/images/rider/5.png b/images/rider/5.png deleted file mode 100644 index 8560553..0000000 Binary files a/images/rider/5.png and /dev/null differ diff --git a/images/rider/6.png b/images/rider/6.png deleted file mode 100644 index 79aef61..0000000 Binary files a/images/rider/6.png and /dev/null differ diff --git a/images/rider/7.png b/images/rider/7.png deleted file mode 100644 index bf437ff..0000000 Binary files a/images/rider/7.png and /dev/null differ diff --git a/images/rider/8.png b/images/rider/8.png deleted file mode 100644 index 955370a..0000000 Binary files a/images/rider/8.png and /dev/null differ diff --git a/images/ruler/1.png b/images/ruler/1.png deleted file mode 100644 index 6a6d518..0000000 Binary files a/images/ruler/1.png and /dev/null differ diff --git a/images/ruler/2.png b/images/ruler/2.png deleted file mode 100644 index fe07e21..0000000 Binary files a/images/ruler/2.png and /dev/null differ diff --git a/images/ruler/3.png b/images/ruler/3.png deleted file mode 100644 index ebf0d0f..0000000 Binary files a/images/ruler/3.png and /dev/null differ diff --git a/images/saber/1.png b/images/saber/1.png deleted file mode 100644 index ffe4235..0000000 Binary files a/images/saber/1.png and /dev/null differ diff --git a/images/saber/2.png b/images/saber/2.png deleted file mode 100644 index 006e922..0000000 Binary files a/images/saber/2.png and /dev/null differ diff --git a/images/saber/3.png b/images/saber/3.png deleted file mode 100644 index 3aaa7bc..0000000 Binary files a/images/saber/3.png and /dev/null differ diff --git a/images/saber/4.png b/images/saber/4.png deleted file mode 100644 index 3bc9a17..0000000 Binary files a/images/saber/4.png and /dev/null differ diff --git a/images/saber/5.png b/images/saber/5.png deleted file mode 100644 index 7f7acd3..0000000 Binary files a/images/saber/5.png and /dev/null differ diff --git a/images/saber/6.png b/images/saber/6.png deleted file mode 100644 index 4216971..0000000 Binary files a/images/saber/6.png and /dev/null differ diff --git a/images/saber/7.png b/images/saber/7.png deleted file mode 100644 index e7e58ea..0000000 Binary files a/images/saber/7.png and /dev/null differ diff --git a/images/saber/8.png b/images/saber/8.png deleted file mode 100644 index d043f34..0000000 Binary files a/images/saber/8.png and /dev/null differ diff --git a/images/saber/9.png b/images/saber/9.png deleted file mode 100644 index f7b83f1..0000000 Binary files a/images/saber/9.png and /dev/null differ diff --git a/images/servents/106.png b/images/servents/106.png new file mode 100644 index 0000000..7e8b6dd Binary files /dev/null and b/images/servents/106.png differ diff --git a/images/servents/108.png b/images/servents/108.png new file mode 100644 index 0000000..2e0df13 Binary files /dev/null and b/images/servents/108.png differ diff --git a/images/servents/112.png b/images/servents/112.png new file mode 100644 index 0000000..3bb204f Binary files /dev/null and b/images/servents/112.png differ diff --git a/images/servents/113.png b/images/servents/113.png new file mode 100644 index 0000000..ed0d39c Binary files /dev/null and b/images/servents/113.png differ diff --git a/images/servents/114.png b/images/servents/114.png new file mode 100644 index 0000000..436e20e Binary files /dev/null and b/images/servents/114.png differ diff --git a/images/servents/118.png b/images/servents/118.png new file mode 100644 index 0000000..d3f68d5 Binary files /dev/null and b/images/servents/118.png differ diff --git a/images/servents/119.png b/images/servents/119.png new file mode 100644 index 0000000..c7c3f53 Binary files /dev/null and b/images/servents/119.png differ diff --git a/images/servents/12.png b/images/servents/12.png new file mode 100644 index 0000000..27dd34c Binary files /dev/null and b/images/servents/12.png differ diff --git a/images/servents/127.png b/images/servents/127.png new file mode 100644 index 0000000..f5d9138 Binary files /dev/null and b/images/servents/127.png differ diff --git a/images/servents/128.png b/images/servents/128.png new file mode 100644 index 0000000..1637c85 Binary files /dev/null and b/images/servents/128.png differ diff --git a/images/servents/129.png b/images/servents/129.png new file mode 100644 index 0000000..5202181 Binary files /dev/null and b/images/servents/129.png differ diff --git a/images/servents/136.png b/images/servents/136.png new file mode 100644 index 0000000..80a088c Binary files /dev/null and b/images/servents/136.png differ diff --git a/images/servents/139.png b/images/servents/139.png new file mode 100644 index 0000000..68bec5f Binary files /dev/null and b/images/servents/139.png differ diff --git a/images/servents/142.png b/images/servents/142.png new file mode 100644 index 0000000..9e8f1ed Binary files /dev/null and b/images/servents/142.png differ diff --git a/images/servents/143.png b/images/servents/143.png new file mode 100644 index 0000000..19a5a62 Binary files /dev/null and b/images/servents/143.png differ diff --git a/images/servents/144.png b/images/servents/144.png new file mode 100644 index 0000000..92330e6 Binary files /dev/null and b/images/servents/144.png differ diff --git a/images/servents/150.png b/images/servents/150.png new file mode 100644 index 0000000..70d3994 Binary files /dev/null and b/images/servents/150.png differ diff --git a/images/servents/153.png b/images/servents/153.png new file mode 100644 index 0000000..2606254 Binary files /dev/null and b/images/servents/153.png differ diff --git a/images/servents/154.png b/images/servents/154.png new file mode 100644 index 0000000..20f6ef7 Binary files /dev/null and b/images/servents/154.png differ diff --git a/images/servents/155.png b/images/servents/155.png new file mode 100644 index 0000000..9068678 Binary files /dev/null and b/images/servents/155.png differ diff --git a/images/servents/156.png b/images/servents/156.png new file mode 100644 index 0000000..57bcb7b Binary files /dev/null and b/images/servents/156.png differ diff --git a/images/servents/160.png b/images/servents/160.png new file mode 100644 index 0000000..1e2ce85 Binary files /dev/null and b/images/servents/160.png differ diff --git a/images/servents/161.png b/images/servents/161.png new file mode 100644 index 0000000..4f438d9 Binary files /dev/null and b/images/servents/161.png differ diff --git a/images/servents/163.png b/images/servents/163.png new file mode 100644 index 0000000..a06b978 Binary files /dev/null and b/images/servents/163.png differ diff --git a/images/servents/167.png b/images/servents/167.png new file mode 100644 index 0000000..d24a7e9 Binary files /dev/null and b/images/servents/167.png differ diff --git a/images/servents/169.png b/images/servents/169.png new file mode 100644 index 0000000..eefb236 Binary files /dev/null and b/images/servents/169.png differ diff --git a/images/servents/173.png b/images/servents/173.png new file mode 100644 index 0000000..2fb2b76 Binary files /dev/null and b/images/servents/173.png differ diff --git a/images/servents/175.png b/images/servents/175.png new file mode 100644 index 0000000..8eba680 Binary files /dev/null and b/images/servents/175.png differ diff --git a/images/servents/179.png b/images/servents/179.png new file mode 100644 index 0000000..50d68ca Binary files /dev/null and b/images/servents/179.png differ diff --git a/images/servents/189.png b/images/servents/189.png new file mode 100644 index 0000000..b49707a Binary files /dev/null and b/images/servents/189.png differ diff --git a/images/servents/195.png b/images/servents/195.png new file mode 100644 index 0000000..2482051 Binary files /dev/null and b/images/servents/195.png differ diff --git a/images/servents/196.png b/images/servents/196.png new file mode 100644 index 0000000..e1112a9 Binary files /dev/null and b/images/servents/196.png differ diff --git a/images/servents/198.png b/images/servents/198.png new file mode 100644 index 0000000..4eec1a7 Binary files /dev/null and b/images/servents/198.png differ diff --git a/images/servents/199.png b/images/servents/199.png new file mode 100644 index 0000000..1811214 Binary files /dev/null and b/images/servents/199.png differ diff --git a/images/servents/2.png b/images/servents/2.png new file mode 100644 index 0000000..2c8def5 Binary files /dev/null and b/images/servents/2.png differ diff --git a/images/servents/201.png b/images/servents/201.png new file mode 100644 index 0000000..e1ee7db Binary files /dev/null and b/images/servents/201.png differ diff --git a/images/servents/205.png b/images/servents/205.png new file mode 100644 index 0000000..9619441 Binary files /dev/null and b/images/servents/205.png differ diff --git a/images/servents/206.png b/images/servents/206.png new file mode 100644 index 0000000..81e80fa Binary files /dev/null and b/images/servents/206.png differ diff --git a/images/servents/209.png b/images/servents/209.png new file mode 100644 index 0000000..dcc249c Binary files /dev/null and b/images/servents/209.png differ diff --git a/images/servents/212.png b/images/servents/212.png new file mode 100644 index 0000000..f19c92b Binary files /dev/null and b/images/servents/212.png differ diff --git a/images/servents/213.png b/images/servents/213.png new file mode 100644 index 0000000..b13e565 Binary files /dev/null and b/images/servents/213.png differ diff --git a/images/servents/215.png b/images/servents/215.png new file mode 100644 index 0000000..a56e773 Binary files /dev/null and b/images/servents/215.png differ diff --git a/images/servents/216.png b/images/servents/216.png new file mode 100644 index 0000000..beaed79 Binary files /dev/null and b/images/servents/216.png differ diff --git a/images/servents/220.png b/images/servents/220.png new file mode 100644 index 0000000..9491b30 Binary files /dev/null and b/images/servents/220.png differ diff --git a/images/servents/224.png b/images/servents/224.png new file mode 100644 index 0000000..08bb9a4 Binary files /dev/null and b/images/servents/224.png differ diff --git a/images/servents/226.png b/images/servents/226.png new file mode 100644 index 0000000..7f7a0d5 Binary files /dev/null and b/images/servents/226.png differ diff --git a/images/servents/229.png b/images/servents/229.png new file mode 100644 index 0000000..28d1db6 Binary files /dev/null and b/images/servents/229.png differ diff --git a/images/servents/232.png b/images/servents/232.png new file mode 100644 index 0000000..3fa7379 Binary files /dev/null and b/images/servents/232.png differ diff --git a/images/servents/234.png b/images/servents/234.png new file mode 100644 index 0000000..6811098 Binary files /dev/null and b/images/servents/234.png differ diff --git a/images/servents/235.png b/images/servents/235.png new file mode 100644 index 0000000..77fc3f6 Binary files /dev/null and b/images/servents/235.png differ diff --git a/images/servents/237.png b/images/servents/237.png new file mode 100644 index 0000000..eaa5131 Binary files /dev/null and b/images/servents/237.png differ diff --git a/images/servents/238.png b/images/servents/238.png new file mode 100644 index 0000000..4e0c556 Binary files /dev/null and b/images/servents/238.png differ diff --git a/images/servents/239.png b/images/servents/239.png new file mode 100644 index 0000000..060c3f3 Binary files /dev/null and b/images/servents/239.png differ diff --git a/images/servents/241.png b/images/servents/241.png new file mode 100644 index 0000000..16cea2a Binary files /dev/null and b/images/servents/241.png differ diff --git a/images/servents/244.png b/images/servents/244.png new file mode 100644 index 0000000..7d817d8 Binary files /dev/null and b/images/servents/244.png differ diff --git a/images/servents/247.png b/images/servents/247.png new file mode 100644 index 0000000..6f272bf Binary files /dev/null and b/images/servents/247.png differ diff --git a/images/servents/250.png b/images/servents/250.png new file mode 100644 index 0000000..71027fd Binary files /dev/null and b/images/servents/250.png differ diff --git a/images/servents/253.png b/images/servents/253.png new file mode 100644 index 0000000..254faba Binary files /dev/null and b/images/servents/253.png differ diff --git a/images/servents/261.png b/images/servents/261.png new file mode 100644 index 0000000..a7ec982 Binary files /dev/null and b/images/servents/261.png differ diff --git a/images/servents/265.png b/images/servents/265.png new file mode 100644 index 0000000..e2f6e0b Binary files /dev/null and b/images/servents/265.png differ diff --git a/images/servents/268.png b/images/servents/268.png new file mode 100644 index 0000000..7d77ed6 Binary files /dev/null and b/images/servents/268.png differ diff --git a/images/servents/270.png b/images/servents/270.png new file mode 100644 index 0000000..5285178 Binary files /dev/null and b/images/servents/270.png differ diff --git a/images/servents/272.png b/images/servents/272.png new file mode 100644 index 0000000..cdf1ceb Binary files /dev/null and b/images/servents/272.png differ diff --git a/images/servents/274.png b/images/servents/274.png new file mode 100644 index 0000000..346b2a5 Binary files /dev/null and b/images/servents/274.png differ diff --git a/images/servents/275.png b/images/servents/275.png new file mode 100644 index 0000000..10eabf5 Binary files /dev/null and b/images/servents/275.png differ diff --git a/images/servents/276.png b/images/servents/276.png new file mode 100644 index 0000000..13958ea Binary files /dev/null and b/images/servents/276.png differ diff --git a/images/servents/277.png b/images/servents/277.png new file mode 100644 index 0000000..29302e5 Binary files /dev/null and b/images/servents/277.png differ diff --git a/images/servents/278.png b/images/servents/278.png new file mode 100644 index 0000000..898edda Binary files /dev/null and b/images/servents/278.png differ diff --git a/images/servents/280.png b/images/servents/280.png new file mode 100644 index 0000000..1b302ee Binary files /dev/null and b/images/servents/280.png differ diff --git a/images/servents/281.png b/images/servents/281.png new file mode 100644 index 0000000..d87f9f7 Binary files /dev/null and b/images/servents/281.png differ diff --git a/images/servents/284.png b/images/servents/284.png new file mode 100644 index 0000000..17c1adc Binary files /dev/null and b/images/servents/284.png differ diff --git a/images/servents/285.png b/images/servents/285.png new file mode 100644 index 0000000..ba39799 Binary files /dev/null and b/images/servents/285.png differ diff --git a/images/servents/289.png b/images/servents/289.png new file mode 100644 index 0000000..1491fad Binary files /dev/null and b/images/servents/289.png differ diff --git a/images/servents/292.png b/images/servents/292.png new file mode 100644 index 0000000..0d6e93c Binary files /dev/null and b/images/servents/292.png differ diff --git a/images/servents/295.png b/images/servents/295.png new file mode 100644 index 0000000..2cb5a09 Binary files /dev/null and b/images/servents/295.png differ diff --git a/images/servents/296.png b/images/servents/296.png new file mode 100644 index 0000000..2701034 Binary files /dev/null and b/images/servents/296.png differ diff --git a/images/servents/297.png b/images/servents/297.png new file mode 100644 index 0000000..157d727 Binary files /dev/null and b/images/servents/297.png differ diff --git a/images/servents/299.png b/images/servents/299.png new file mode 100644 index 0000000..6e9df5b Binary files /dev/null and b/images/servents/299.png differ diff --git a/images/servents/300.png b/images/servents/300.png new file mode 100644 index 0000000..efcb217 Binary files /dev/null and b/images/servents/300.png differ diff --git a/images/servents/302.png b/images/servents/302.png new file mode 100644 index 0000000..f783bd5 Binary files /dev/null and b/images/servents/302.png differ diff --git a/images/servents/303.png b/images/servents/303.png new file mode 100644 index 0000000..b5bd7c5 Binary files /dev/null and b/images/servents/303.png differ diff --git a/images/servents/305.png b/images/servents/305.png new file mode 100644 index 0000000..66a3703 Binary files /dev/null and b/images/servents/305.png differ diff --git a/images/servents/306.png b/images/servents/306.png new file mode 100644 index 0000000..96f47f9 Binary files /dev/null and b/images/servents/306.png differ diff --git a/images/servents/307.png b/images/servents/307.png new file mode 100644 index 0000000..1d7fbff Binary files /dev/null and b/images/servents/307.png differ diff --git a/images/servents/309.png b/images/servents/309.png new file mode 100644 index 0000000..19338f8 Binary files /dev/null and b/images/servents/309.png differ diff --git a/images/servents/312.png b/images/servents/312.png new file mode 100644 index 0000000..9cea306 Binary files /dev/null and b/images/servents/312.png differ diff --git a/images/servents/314.png b/images/servents/314.png new file mode 100644 index 0000000..a586e80 Binary files /dev/null and b/images/servents/314.png differ diff --git a/images/servents/316.png b/images/servents/316.png new file mode 100644 index 0000000..f5c5b66 Binary files /dev/null and b/images/servents/316.png differ diff --git a/images/servents/317.png b/images/servents/317.png new file mode 100644 index 0000000..ccec697 Binary files /dev/null and b/images/servents/317.png differ diff --git a/images/servents/321.png b/images/servents/321.png new file mode 100644 index 0000000..e7a036b Binary files /dev/null and b/images/servents/321.png differ diff --git a/images/servents/324.png b/images/servents/324.png new file mode 100644 index 0000000..c5dfb2d Binary files /dev/null and b/images/servents/324.png differ diff --git a/images/servents/327.png b/images/servents/327.png new file mode 100644 index 0000000..18d7208 Binary files /dev/null and b/images/servents/327.png differ diff --git a/images/servents/329.png b/images/servents/329.png new file mode 100644 index 0000000..1c45931 Binary files /dev/null and b/images/servents/329.png differ diff --git a/images/servents/331.png b/images/servents/331.png new file mode 100644 index 0000000..b4816c6 Binary files /dev/null and b/images/servents/331.png differ diff --git a/images/servents/334.png b/images/servents/334.png new file mode 100644 index 0000000..55ea6fa Binary files /dev/null and b/images/servents/334.png differ diff --git a/images/servents/336.png b/images/servents/336.png new file mode 100644 index 0000000..a7c350e Binary files /dev/null and b/images/servents/336.png differ diff --git a/images/servents/337.png b/images/servents/337.png new file mode 100644 index 0000000..4c4e830 Binary files /dev/null and b/images/servents/337.png differ diff --git a/images/servents/339.png b/images/servents/339.png new file mode 100644 index 0000000..5cfe144 Binary files /dev/null and b/images/servents/339.png differ diff --git a/images/servents/342.png b/images/servents/342.png new file mode 100644 index 0000000..98b24aa Binary files /dev/null and b/images/servents/342.png differ diff --git a/images/servents/343.png b/images/servents/343.png new file mode 100644 index 0000000..f34315b Binary files /dev/null and b/images/servents/343.png differ diff --git a/images/servents/346.png b/images/servents/346.png new file mode 100644 index 0000000..f45e376 Binary files /dev/null and b/images/servents/346.png differ diff --git a/images/servents/349.png b/images/servents/349.png new file mode 100644 index 0000000..7f4d13e Binary files /dev/null and b/images/servents/349.png differ diff --git a/images/servents/350.png b/images/servents/350.png new file mode 100644 index 0000000..95e8658 Binary files /dev/null and b/images/servents/350.png differ diff --git a/images/servents/351.png b/images/servents/351.png new file mode 100644 index 0000000..00ca2df Binary files /dev/null and b/images/servents/351.png differ diff --git a/images/servents/353.png b/images/servents/353.png new file mode 100644 index 0000000..eebc1c3 Binary files /dev/null and b/images/servents/353.png differ diff --git a/images/servents/355.png b/images/servents/355.png new file mode 100644 index 0000000..7c157c4 Binary files /dev/null and b/images/servents/355.png differ diff --git a/images/servents/357.png b/images/servents/357.png new file mode 100644 index 0000000..ca06d38 Binary files /dev/null and b/images/servents/357.png differ diff --git a/images/servents/362.png b/images/servents/362.png new file mode 100644 index 0000000..275b678 Binary files /dev/null and b/images/servents/362.png differ diff --git a/images/servents/365.png b/images/servents/365.png new file mode 100644 index 0000000..23dabf8 Binary files /dev/null and b/images/servents/365.png differ diff --git a/images/servents/368.png b/images/servents/368.png new file mode 100644 index 0000000..1dce4a8 Binary files /dev/null and b/images/servents/368.png differ diff --git a/images/servents/369.png b/images/servents/369.png new file mode 100644 index 0000000..05cd719 Binary files /dev/null and b/images/servents/369.png differ diff --git a/images/servents/37.png b/images/servents/37.png new file mode 100644 index 0000000..a4325e8 Binary files /dev/null and b/images/servents/37.png differ diff --git a/images/servents/370.png b/images/servents/370.png new file mode 100644 index 0000000..dc335a7 Binary files /dev/null and b/images/servents/370.png differ diff --git a/images/servents/371.png b/images/servents/371.png new file mode 100644 index 0000000..138d009 Binary files /dev/null and b/images/servents/371.png differ diff --git a/images/servents/373.png b/images/servents/373.png new file mode 100644 index 0000000..e8884b4 Binary files /dev/null and b/images/servents/373.png differ diff --git a/images/servents/374.png b/images/servents/374.png new file mode 100644 index 0000000..40b82a3 Binary files /dev/null and b/images/servents/374.png differ diff --git a/images/servents/375.png b/images/servents/375.png new file mode 100644 index 0000000..4b42497 Binary files /dev/null and b/images/servents/375.png differ diff --git a/images/servents/376.png b/images/servents/376.png new file mode 100644 index 0000000..51df6a1 Binary files /dev/null and b/images/servents/376.png differ diff --git a/images/servents/377.png b/images/servents/377.png new file mode 100644 index 0000000..d7b3a32 Binary files /dev/null and b/images/servents/377.png differ diff --git a/images/servents/380.png b/images/servents/380.png new file mode 100644 index 0000000..9c7ddf2 Binary files /dev/null and b/images/servents/380.png differ diff --git a/images/servents/381.png b/images/servents/381.png new file mode 100644 index 0000000..d948f29 Binary files /dev/null and b/images/servents/381.png differ diff --git a/images/servents/383.png b/images/servents/383.png new file mode 100644 index 0000000..c2ef350 Binary files /dev/null and b/images/servents/383.png differ diff --git a/images/servents/384.png b/images/servents/384.png new file mode 100644 index 0000000..3bdabf3 Binary files /dev/null and b/images/servents/384.png differ diff --git a/images/servents/385.png b/images/servents/385.png new file mode 100644 index 0000000..4421fab Binary files /dev/null and b/images/servents/385.png differ diff --git a/images/servents/386.png b/images/servents/386.png new file mode 100644 index 0000000..ce02493 Binary files /dev/null and b/images/servents/386.png differ diff --git a/images/servents/390.png b/images/servents/390.png new file mode 100644 index 0000000..8afa01b Binary files /dev/null and b/images/servents/390.png differ diff --git a/images/servents/393.png b/images/servents/393.png new file mode 100644 index 0000000..db1314f Binary files /dev/null and b/images/servents/393.png differ diff --git a/images/servents/394.png b/images/servents/394.png new file mode 100644 index 0000000..ab01448 Binary files /dev/null and b/images/servents/394.png differ diff --git a/images/servents/397.png b/images/servents/397.png new file mode 100644 index 0000000..7df91fe Binary files /dev/null and b/images/servents/397.png differ diff --git a/images/servents/400.png b/images/servents/400.png new file mode 100644 index 0000000..24fee3d Binary files /dev/null and b/images/servents/400.png differ diff --git a/images/servents/402.png b/images/servents/402.png new file mode 100644 index 0000000..c83e1b6 Binary files /dev/null and b/images/servents/402.png differ diff --git a/images/servents/403.png b/images/servents/403.png new file mode 100644 index 0000000..d93d3d6 Binary files /dev/null and b/images/servents/403.png differ diff --git a/images/servents/406.png b/images/servents/406.png new file mode 100644 index 0000000..a8d6512 Binary files /dev/null and b/images/servents/406.png differ diff --git a/images/servents/407.png b/images/servents/407.png new file mode 100644 index 0000000..2275b6e Binary files /dev/null and b/images/servents/407.png differ diff --git a/images/servents/409.png b/images/servents/409.png new file mode 100644 index 0000000..ab44688 Binary files /dev/null and b/images/servents/409.png differ diff --git a/images/servents/413.png b/images/servents/413.png new file mode 100644 index 0000000..d8fce1b Binary files /dev/null and b/images/servents/413.png differ diff --git a/images/servents/415.png b/images/servents/415.png new file mode 100644 index 0000000..47f524c Binary files /dev/null and b/images/servents/415.png differ diff --git a/images/servents/416.png b/images/servents/416.png new file mode 100644 index 0000000..6ca9440 Binary files /dev/null and b/images/servents/416.png differ diff --git a/images/servents/417.png b/images/servents/417.png new file mode 100644 index 0000000..be2794d Binary files /dev/null and b/images/servents/417.png differ diff --git a/images/servents/418.png b/images/servents/418.png new file mode 100644 index 0000000..b9f5b10 Binary files /dev/null and b/images/servents/418.png differ diff --git a/images/servents/421.png b/images/servents/421.png new file mode 100644 index 0000000..60a1077 Binary files /dev/null and b/images/servents/421.png differ diff --git a/images/servents/426.png b/images/servents/426.png new file mode 100644 index 0000000..cf354ff Binary files /dev/null and b/images/servents/426.png differ diff --git a/images/servents/427.png b/images/servents/427.png new file mode 100644 index 0000000..e5a6f19 Binary files /dev/null and b/images/servents/427.png differ diff --git a/images/servents/429.png b/images/servents/429.png new file mode 100644 index 0000000..1c5595d Binary files /dev/null and b/images/servents/429.png differ diff --git a/images/servents/431.png b/images/servents/431.png new file mode 100644 index 0000000..69abf58 Binary files /dev/null and b/images/servents/431.png differ diff --git a/images/servents/432.png b/images/servents/432.png new file mode 100644 index 0000000..169fcaf Binary files /dev/null and b/images/servents/432.png differ diff --git a/images/servents/433.png b/images/servents/433.png new file mode 100644 index 0000000..c6fa468 Binary files /dev/null and b/images/servents/433.png differ diff --git a/images/servents/435.png b/images/servents/435.png new file mode 100644 index 0000000..3761549 Binary files /dev/null and b/images/servents/435.png differ diff --git a/images/servents/437.png b/images/servents/437.png new file mode 100644 index 0000000..98d01db Binary files /dev/null and b/images/servents/437.png differ diff --git a/images/servents/438.png b/images/servents/438.png new file mode 100644 index 0000000..a276681 Binary files /dev/null and b/images/servents/438.png differ diff --git a/images/servents/440.png b/images/servents/440.png new file mode 100644 index 0000000..34a1eb1 Binary files /dev/null and b/images/servents/440.png differ diff --git a/images/servents/441.png b/images/servents/441.png new file mode 100644 index 0000000..5ffc347 Binary files /dev/null and b/images/servents/441.png differ diff --git a/images/servents/442.png b/images/servents/442.png new file mode 100644 index 0000000..fb7a6bf Binary files /dev/null and b/images/servents/442.png differ diff --git a/images/servents/444.png b/images/servents/444.png new file mode 100644 index 0000000..1e6aa51 Binary files /dev/null and b/images/servents/444.png differ diff --git a/images/servents/445.png b/images/servents/445.png new file mode 100644 index 0000000..ee4c85c Binary files /dev/null and b/images/servents/445.png differ diff --git a/images/servents/448.png b/images/servents/448.png new file mode 100644 index 0000000..f9fe23d Binary files /dev/null and b/images/servents/448.png differ diff --git a/images/servents/450.png b/images/servents/450.png new file mode 100644 index 0000000..20b1fce Binary files /dev/null and b/images/servents/450.png differ diff --git a/images/servents/452.png b/images/servents/452.png new file mode 100644 index 0000000..c4f31e8 Binary files /dev/null and b/images/servents/452.png differ diff --git a/images/servents/453.png b/images/servents/453.png new file mode 100644 index 0000000..be7b651 Binary files /dev/null and b/images/servents/453.png differ diff --git a/images/servents/456.png b/images/servents/456.png new file mode 100644 index 0000000..1883508 Binary files /dev/null and b/images/servents/456.png differ diff --git a/images/servents/457.png b/images/servents/457.png new file mode 100644 index 0000000..36dd745 Binary files /dev/null and b/images/servents/457.png differ diff --git a/images/servents/459.png b/images/servents/459.png new file mode 100644 index 0000000..ce45aff Binary files /dev/null and b/images/servents/459.png differ diff --git a/images/servents/461.png b/images/servents/461.png new file mode 100644 index 0000000..2ce119f Binary files /dev/null and b/images/servents/461.png differ diff --git a/images/servents/462.png b/images/servents/462.png new file mode 100644 index 0000000..e67e6d3 Binary files /dev/null and b/images/servents/462.png differ diff --git a/images/servents/465.png b/images/servents/465.png new file mode 100644 index 0000000..148f243 Binary files /dev/null and b/images/servents/465.png differ diff --git a/images/servents/51.png b/images/servents/51.png new file mode 100644 index 0000000..2c49d8a Binary files /dev/null and b/images/servents/51.png differ diff --git a/images/servents/52.png b/images/servents/52.png new file mode 100644 index 0000000..e788f56 Binary files /dev/null and b/images/servents/52.png differ diff --git a/images/servents/59.png b/images/servents/59.png new file mode 100644 index 0000000..d022364 Binary files /dev/null and b/images/servents/59.png differ diff --git a/images/servents/60.png b/images/servents/60.png new file mode 100644 index 0000000..ce889b8 Binary files /dev/null and b/images/servents/60.png differ diff --git a/images/servents/62.png b/images/servents/62.png new file mode 100644 index 0000000..0b12709 Binary files /dev/null and b/images/servents/62.png differ diff --git a/images/servents/65.png b/images/servents/65.png new file mode 100644 index 0000000..63a9a08 Binary files /dev/null and b/images/servents/65.png differ diff --git a/images/servents/68.png b/images/servents/68.png new file mode 100644 index 0000000..5c7eda7 Binary files /dev/null and b/images/servents/68.png differ diff --git a/images/servents/70.png b/images/servents/70.png new file mode 100644 index 0000000..ec3b385 Binary files /dev/null and b/images/servents/70.png differ diff --git a/images/servents/75.png b/images/servents/75.png new file mode 100644 index 0000000..68a4b00 Binary files /dev/null and b/images/servents/75.png differ diff --git a/images/servents/76.png b/images/servents/76.png new file mode 100644 index 0000000..2a04552 Binary files /dev/null and b/images/servents/76.png differ diff --git a/images/servents/77.png b/images/servents/77.png new file mode 100644 index 0000000..21598b1 Binary files /dev/null and b/images/servents/77.png differ diff --git a/images/servents/8.png b/images/servents/8.png new file mode 100644 index 0000000..b1dc0eb Binary files /dev/null and b/images/servents/8.png differ diff --git a/images/servents/84.png b/images/servents/84.png new file mode 100644 index 0000000..460440c Binary files /dev/null and b/images/servents/84.png differ diff --git a/images/servents/85.png b/images/servents/85.png new file mode 100644 index 0000000..c987740 Binary files /dev/null and b/images/servents/85.png differ diff --git a/images/servents/86.png b/images/servents/86.png new file mode 100644 index 0000000..323e1db Binary files /dev/null and b/images/servents/86.png differ diff --git a/images/servents/88.png b/images/servents/88.png new file mode 100644 index 0000000..b1eb964 Binary files /dev/null and b/images/servents/88.png differ diff --git a/images/servents/90.png b/images/servents/90.png new file mode 100644 index 0000000..bd022e0 Binary files /dev/null and b/images/servents/90.png differ diff --git a/images/servents/91.png b/images/servents/91.png new file mode 100644 index 0000000..3619b26 Binary files /dev/null and b/images/servents/91.png differ diff --git a/images/servents/93.png b/images/servents/93.png new file mode 100644 index 0000000..688e5f0 Binary files /dev/null and b/images/servents/93.png differ diff --git a/images/servents/96.png b/images/servents/96.png new file mode 100644 index 0000000..9c9551a Binary files /dev/null and b/images/servents/96.png differ diff --git a/images/servents/97.png b/images/servents/97.png new file mode 100644 index 0000000..62eec6a Binary files /dev/null and b/images/servents/97.png differ diff --git a/images/servents/98.png b/images/servents/98.png new file mode 100644 index 0000000..cdf090f Binary files /dev/null and b/images/servents/98.png differ diff --git a/images/servents/99.png b/images/servents/99.png new file mode 100644 index 0000000..ec4eab6 Binary files /dev/null and b/images/servents/99.png differ diff --git a/images/servents/999.png b/images/servents/999.png new file mode 100644 index 0000000..29b11e3 Binary files /dev/null and b/images/servents/999.png differ diff --git a/index.html b/index.html index 06106df..f216254 100644 --- a/index.html +++ b/index.html @@ -1,34 +1,82 @@ - 持有英靈一覽表 - + + FGO持有五星英靈一覽表 + - + + + - + \ No newline at end of file diff --git a/init.js b/init.js new file mode 100644 index 0000000..636f0b9 --- /dev/null +++ b/init.js @@ -0,0 +1,858 @@ +// =================================================================================== +// 0. 儲存與帳號管理 (原 fgoStorage.js) +// =================================================================================== +const FGO_STORAGE = "FGO_Storage"; +const ACCOUNT_KEY = "FGO_Account"; + +function toggleAccount() { + const currentAccount = localStorage.getItem(ACCOUNT_KEY) || "account1"; + const newAccount = currentAccount === "account1" ? "account2" : "account1"; + localStorage.setItem(ACCOUNT_KEY, newAccount); + console.log(`Account switched to: ${newAccount}`); +} +function getCurrentAccount() { return localStorage.getItem(ACCOUNT_KEY) || "account1"; } +function getData(name) { const acc = getCurrentAccount(); const item = localStorage.getItem(`${name}_${acc}`); return item ? JSON.parse(item) : []; } +function setData(name, content) { const acc = getCurrentAccount(); if (content) localStorage.setItem(`${name}_${acc}`, JSON.stringify(content)); } +function deleteData(name) { const acc = getCurrentAccount(); localStorage.removeItem(`${name}_${acc}`); } +function updateData(units) { + if (!units) return; + const newData = units.flat(2).filter(x => x); + const currentData = getData(FGO_STORAGE); + const storageMap = new Map(); + currentData.forEach(unit => { if (unit.no) storageMap.set(unit.no, unit); }); + newData.forEach(unit => { + if (unit.no) { + // 更新儲存條件 + if (unit.npLv > 0 || unit.mark > 0 || unit.lv120 > 0 || unit.crowned > 0) { + // 儲存新資料 + storageMap.set(String(unit.no), { + npLv: unit.npLv, + mark: unit.mark, + lv120: unit.lv120, + crowned: unit.crowned, + no: String(unit.no) + }); + } + else storageMap.delete(String(unit.no)); + } + }); + setData(FGO_STORAGE, Array.from(storageMap.values())); +} +function migrateOldData() { const oldData = localStorage.getItem(FGO_STORAGE); if (oldData && !localStorage.getItem(`${FGO_STORAGE}_account1`)) { localStorage.setItem(`${FGO_STORAGE}_account1`, oldData); console.log("舊資料已成功遷移到帳號1"); } } + + +// =================================================================================== +// 1. 全域變數與資料定義 +// =================================================================================== +var canvas, context; +var CELL_SIZE = 50, caculateField = 70, row_padding = 30, col_padding = 20; +var marginTop = 10, marginLeft = 10; +const FOOTER_HEIGHT = 50; +var country = localStorage.getItem("r_country") || "jp"; +var currentLang = getLanguage(); +var mode = 0, luckyBag = 0; // mode 預設為 0 (設定數量) +var CategoryNum; +var bgcolor = "rgb(176, 176, 176)", mask = "rgb(0, 0, 0, 0.6)", font_color = "rgb(0, 0, 0)"; +var init_npLv = 6, npLv = init_npLv; + +const Category = ['saber', 'archer', 'lancer', 'rider', 'caster', 'assassin', 'berserker', + 'ruler', 'avenger', 'alterego', 'foreigner', 'mooncancer', 'pretender', 'beast', + 'unbeast', 'shielder', 'luckybag1', 'luckybag2', 'luckybag3', 'luckybag4', 'luckybag5']; +const CategoryLen = Category.length; +const Marks = ['hiclipart', 'heart']; + +// 移除所有福袋的 const 變數,只保留 jp, tw, z 的基本資料 +const servents = {'saber': [2, 8, 68, 76, 90, 91, 153, 160, 213, 234, 270, 278, 299, 302, 317, 337, 343, 384, 402, 432, 445, 456, 461], + 'archer': [12, 60, 77, 84, 129, 142, 156, 212, 216, 272, 276, 350, 375, 383, 394, 427, 450], + 'lancer': [70, 85, 88, 119, 128, 143, 196, 232, 280, 300, 312, 329, 368, 381, 433, 442, 457, 465], + 'rider': [65, 99, 108, 118, 144, 179, 205, 206, 241, 253, 274, 277, 296, 331, 342, 349, 397, 406, 452], + 'caster': [37, 62, 113, 127, 136, 150, 169, 175, 201, 215, 237, 284, 307, 327, 385, 415, 435, 462], + 'assassin': [75, 86, 112, 139, 154, 189, 199, 235, 239, 314, 365, 371, 380, 453], + 'berserker': [51, 52, 97, 98, 114, 155, 161, 226, 247, 261, 306, 309, 355, 362, 386, 429, 440], + 'ruler': [59, 93, 173, 229, 265, 292, 305, 346, 357, 374, 390, 400, 438], + 'avenger': [96, 106, 250, 268, 303, 321, 370, 403, 407, 409], + 'alterego': [163, 167, 209, 224, 238, 297, 336, 339, 369, 376, 416, 426], + 'foreigner': [195, 198, 275, 281, 289, 295, 324, 334, 373, 393, 413], + 'mooncancer': [220, 244, 285, 351, 418, 421, 448], + 'pretender': [316, 353, 431, 437, 441, 459], + 'beast': [377, 417], + 'unbeast':[444], + 'shielder': []}; +const z_servants = {saber:[8, 2, 76, 278], archer:[84, 60, 212, 77, 350], lancer:[143, 85, 232, 119, 300], rider:[206, 274, 118, 65, 144, 99, 277, 331, 296], caster:[201, 113, 169, 37, 62], assassin:[189, 75, 235, 380], berserker:[52, 226, 97, 98, 306], ruler:[59], avenger:[370], alterego:[224], mooncancer:[244]}; + +// 福袋資料改用字串當作 key,稍後會從 luckybag.json 載入並填充 +const FGO_DATA = { + 'jp': {servants: servents, type: 'full', isReleased: true, labelKey: 'jp_label'}, + // 台服數量增加變動 [劍, 弓, 槍, 騎, 術, 殺, 狂, 裁, 仇, 丑, 外, 月, 偽, 獸, 非獸, 盾] + 'tw': {servants: servents, type: 'full', isReleased: true, categoryNumOverride: [19, 15, 14, 18, 16, 13, 15, 12, 10, 10, 11, 4, 2, 1], labelKey: 'tw_label'}, + 'z': {servants: z_servants, type: 'partial', isReleased: true, labelKey: 'z_label'}, + 'eighth': {servants: "eighth_servants", type: 'luckyBag', isReleased: false, classIconImg: '888', labelKey: 'eighth_label'}, + 'nineth': {servants: "nineth_servants", type: 'luckyBag', isReleased: true, classIconImg: '99', labelKey: 'nineth_label'}, + 'newyear_24_up': {servants: "newyear_24_up_servants", type: 'luckyBag', isReleased: false, classIconImg: '99', labelKey: 'newyear_24_up_label'}, + 'newyear_24_down': {servants: "newyear_24_down_servants", type: 'luckyBag', isReleased: false, classIconImg: '99', labelKey: 'newyear_24_down_label'}, + 'newyear_25_up': {servants: "newyear_25_up_servants", type: 'luckyBag', isReleased: false, classIconImg: '99', labelKey: 'newyear_25_up_label'}, + 'newyear_25_down': {servants: "newyear_25_down_servants", type: 'luckyBag', isReleased: false, classIconImg: '99', labelKey: 'newyear_25_down_label'}, + 'newyear_25_white': {servants: "newyear_25_white_servants", type: 'luckyBag', isReleased: false, classIconImg: '99', labelKey: 'newyear_25_white_label'}, + 'tenth_up': {servants: "tenth_up_servants", type: 'luckyBag', isReleased: false, classIconImg: [1,1,1,1,2,2,2,3,3,3], labelKey: 'tenth_up_label'}, + 'tenth_down': {servants: "tenth_down_servants", type: 'luckyBag', isReleased: false, classIconImg: [4,4,4,5,5,5,5,6,6,6,7,7,7], labelKey: 'tenth_down_label'}, + 'tenth_ex': {servants: "tenth_ex_servants", type: 'luckyBag', isReleased: false, classIconImg: '99', labelKey: 'tenth_ex_label'}, + 'newyear_26_up': {servants: "newyear_26_up_servants", type: 'luckyBag', isReleased: false, classIconImg: [1,1,1,1,2,2,3,3,3,4,5,5,5,6,6,7,7], labelKey: 'newyear_26_up_label'}, + 'newyear_26_down': {servants: "newyear_26_down_servants", type: 'luckyBag', isReleased: false, classIconImg: [1004,1004,1004,1004,1004,1004,1004,1005,1005,1005,1005,1005,1005,1005], labelKey: 'newyear_26_down_label'}, + 'newyear_26_white': {servants: "newyear_26_white_servants", type: 'luckyBag', isReleased: false, classIconImg: [1,1,2,2,3,4,99,7,1004,1004,1004,1005], labelKey: 'newyear_26_white_label'}, +}; + +// =================================================================================== +// 2. 核心邏輯區 (Core Logic) +// =================================================================================== + +var units = [], svt = {}, categoryImages = [], markImages = [], allModeButtons = []; +var selectedClasses = new Set(); // 用來儲存被選取行的集合 + +const ImagePreloader = { + images: {}, + totalImages: 0, + loadedImages: 0, + init(callback) { + const allServantNos = new Set(); + Object.values(FGO_DATA).forEach(data => { + if (typeof data.servants === 'object') { // 確保 servants 資料已載入 + Object.values(data.servants).forEach(noArray => { + noArray.forEach(no => allServantNos.add(no)); + }); + } + }); + + this.totalImages = allServantNos.size; + if (this.totalImages === 0) { + callback(); + return; + } + + const loadingText = i18n.loadingImages[currentLang]; + this.updateProgress(loadingText); + + allServantNos.forEach(no => { + const img = new Image(); + img.src = `images/servents/${no}.png`; + this.images[no] = img; + img.onload = img.onerror = () => { + this.loadedImages++; + this.updateProgress(loadingText); + if (this.loadedImages === this.totalImages) { + callback(); + } + }; + }); + }, + updateProgress(loadingText) { + const percentage = Math.round((this.loadedImages / this.totalImages) * 100); + const canvas = document.getElementById('canvas'); + const context = canvas.getContext('2d'); + context.fillStyle = bgcolor; + context.fillRect(0, 0, canvas.width, canvas.height); + context.fillStyle = font_color; + context.font = getFontString(30); + context.textAlign = "center"; + context.fillText(`${loadingText}${percentage}%`, canvas.width / 2, canvas.height / 2); + context.textAlign = "start"; + } +}; + + +function getUnit(country) { + const currentData = FGO_DATA[country]; + if (!currentData || typeof currentData.servants !== 'object') { // 檢查資料是否已載入 + alert("資料載入錯誤或尚未完成,請稍後再試: " + country); + return []; + } + const sourceServants = currentData.servants; + CategoryNum = Category.map((className, index) => { + if (currentData.categoryNumOverride) { + return currentData.categoryNumOverride[index] || 0; + } + return sourceServants[className] ? sourceServants[className].length : 0; + }); + + let newUnits = []; + for (let i = 0; i < CategoryLen; i++) { + const className = Category[i]; + newUnits[i] = []; + if (sourceServants[className] && CategoryNum[i] > 0) { + for (let j = 0; j < CategoryNum[i]; j++) { + const no = sourceServants[className][j]; + const unitInstance = { + no: no, + image: ImagePreloader.images[no], + npLv: 0, + mark: 0, + lv120: 0, + crowned: 0 + }; + newUnits[i][j] = unitInstance; + } + } + } + return newUnits; +} + +// 載入福袋 JSON 資料 +async function loadLuckyBagData() { + try { + // 在網址後面加上時間戳記 (?t=...) 或版本號,強迫瀏覽器認為這是新檔案 + const response = await fetch('luckybag.json?v=' + new Date().getTime()); + if (!response.ok) { + throw new Error('無法載入 luckybag.json: ' + response.statusText); + } + const luckyBags = await response.json(); // 解析 JSON + + // 將載入的資料填回 FGO_DATA 物件中 + Object.keys(FGO_DATA).forEach(key => { + const modeData = FGO_DATA[key]; + const servantsKey = modeData.servants; + if (typeof servantsKey === 'string' && luckyBags[servantsKey]) { + modeData.servants = luckyBags[servantsKey]; + } + }); + console.log("福袋資料載入成功!"); + } catch (error) { + console.error("載入福袋資料失敗:", error); + alert("錯誤:無法載入福袋資料,部分福袋模式可能無法使用。"); + } +} + +// 將 init 函式改為 async,以便使用 await +async function init() { + // 靜態圖片(職階圖示)可以先載入 + preloadStaticImages(async () => { + // 在載入英靈圖片前,先等待福袋資料載入完成 + await loadLuckyBagData(); + + // 接著,根據完整的 FGO_DATA 載入所有需要的英靈圖片 + ImagePreloader.init(() => { + // 所有資料和圖片都準備好後,才執行主邏輯 + mainLogic(); + }); + }); +} + + +function mainLogic(state = 0){ + if (state === 1) { + selectedClasses.clear(); + } + const currentCountryData = FGO_DATA[country]; + if (!currentCountryData || !currentCountryData.isReleased) { + console.log(`Saved mode "${country}" is not available. Defaulting to "jp".`); + country = 'jp'; + localStorage.setItem("r_country", 'jp'); + } + + units = getUnit(country); + if (!units) return; + canvas = document.getElementById('canvas'); + context = canvas.getContext('2d'); + + if (state === 0) { + migrateOldData(); + Object.keys(FGO_DATA).forEach(modeKey => { + const modeData = FGO_DATA[modeKey]; + const buttonId = ['jp', 'tw', 'z'].includes(modeKey) ? `${modeKey}-button` : modeKey; + const button = document.getElementById(buttonId); + if (button) { + const listItem = button.parentElement; + if (listItem) { + listItem.style.display = modeData.isReleased ? '' : 'none'; + } + + allModeButtons.push(button); + button.onclick = () => { if (country !== modeKey) { country = modeKey; localStorage.setItem("r_country", country); mainLogic(1); } }; + } + }); + bindActionButtons(); + canvas.onclick = onCanvasClick; + canvas.addEventListener('contextmenu', e => { e.preventDefault(); rightClick(e); }); + } + + const currentButtonId = ['jp', 'tw', 'z'].includes(country) ? `${country}-button` : country; + const currentActiveButton = document.getElementById(currentButtonId); + if (currentActiveButton) Checked(allModeButtons, currentActiveButton); + + const visibleRows = CategoryNum.filter(num => num > 0).length; + const iconWidth = luckyBag ? (Math.max.apply(null,CategoryNum) + 1) * (CELL_SIZE + col_padding) + caculateField : (Math.max.apply(null,CategoryNum) + 1) * (CELL_SIZE + col_padding); + const MIN_CANVAS_WIDTH = 850; + canvas.width = Math.max(iconWidth, MIN_CANVAS_WIDTH); + canvas.height = visibleRows * (CELL_SIZE + row_padding) + marginTop + FOOTER_HEIGHT; + + applyLanguage(currentLang); + drawCanvas(); +} + +function drawCanvas() { + context.fillStyle = bgcolor; + context.fillRect (0, 0, canvas.width, canvas.height); + updateUnitsNPLevel(units); + const currentData = FGO_DATA[country]; + const classIconInfo = currentData.classIconImg; + let pass = 0; + for (let i = 0; i < CategoryLen; i++) { + if (CategoryNum[i] > 0) { + const yPos = i - pass; + const rowTopY = yPos * (CELL_SIZE + row_padding) + marginTop; + + if (selectedClasses.has(i)) { + context.fillStyle = 'rgba(255, 0, 0, 0.3)'; + const highlightX = marginLeft - col_padding / 2; + const highlightY = rowTopY - (row_padding / 2) + 10; + const highlightWidth = (CategoryNum[i] + 1) * (CELL_SIZE + col_padding); + const highlightHeight = CELL_SIZE + row_padding; + context.fillRect(highlightX, highlightY, highlightWidth, highlightHeight); + } + + let imgIndex = i; + if (classIconInfo) { + let iconId = Array.isArray(classIconInfo) ? classIconInfo[i] : classIconInfo; + const foundIndex = classes.indexOf(parseInt(iconId)); + if (foundIndex !== -1) imgIndex = foundIndex; + } + drawImage(0, yPos, categoryImages[imgIndex]); + for (let j = 0; j < CategoryNum[i]; j++) { + const unit = units[i][j]; + drawImage(j + 1, yPos, unit.image); + + // 遮罩與NP等級 + if (!unit.npLv) fillRect(j, yPos, mask); + else fillNPText(j, yPos, `${i18n.npLevelPrefix[currentLang]}${unit.npLv}`); + + // 繪製外框 (120等, 戴冠) + const is120 = unit.lv120; + const isCrowned = unit.crowned; + if (is120 && isCrowned) { + drawUnitBorder(j + 1, yPos, "#39C5BB"); // 兩個都有 + } else if (is120) { + drawUnitBorder(j + 1, yPos, "#FFE211"); // 只有120 + } else if (isCrowned) { + drawUnitBorder(j + 1, yPos, "#0000FF"); // 只有戴冠 + } + + // 繪製標記 (愛心等) + if (unit.mark) drawImage(j + 1, yPos, markImages[unit.mark - 1]); + } + } else { + pass++; + } + } + fillTotalText(); + if (luckyBag) fillCaculate(); + context.font = getFontString(20); + context.fillStyle = mask; + context.fillText("This image was made by mgneko, maintained by LeafLu @ ptt", marginLeft, canvas.height - 15); +} + +// 模式按鈕狀態管理函式 +function updateModeButtons(activeIndex) { + const modeButtons = [ + document.getElementById('set-button'), + document.getElementById('mask-button'), + document.getElementById('lv120-button'), + document.getElementById('crowned-button') + ]; + + modeButtons.forEach((btn, index) => { + if (!btn) return; // 避免按鈕不存在時出錯 + if (index === activeIndex) { + btn.classList.replace("btn--primary", "btn--checked"); + } else { + btn.classList.replace("btn--checked", "btn--primary"); + } + }); +} + +function bindActionButtons() { + document.getElementById('switch-account-btn').onclick = switchAccount; + + // 使用新的 updateModeButtons 函式 + document.getElementById('set-button').onclick = () => { + mode = 0; + updateModeButtons(0); + }; + document.getElementById('mask-button').onclick = () => { + mode = 1; + updateModeButtons(1); + }; + // 綁定新按鈕 + document.getElementById('lv120-button').onclick = () => { + mode = 2; + updateModeButtons(2); + }; + document.getElementById('crowned-button').onclick = () => { + mode = 3; + updateModeButtons(3); + }; + + document.getElementById('luckyBag-button').onclick = () => { luckyBag = !luckyBag; if(luckyBag){ document.getElementById('luckyBag-button').classList.replace("btn--primary", "btn--checked"); marginLeft += caculateField; } else { document.getElementById('luckyBag-button').classList.replace("btn--checked", "btn--primary"); marginLeft -= caculateField; } mainLogic(2); }; + document.getElementById('reset').onclick = () => { if (confirm(i18n.confirmClearAll[currentLang])) { deleteData(FGO_STORAGE); localStorage.setItem("r_country", country); location.reload(); } }; + + // 更新 reset-mark 的過濾條件,避免誤刪資料 + document.getElementById('reset-mark').onclick = () => { + if (confirm(i18n.confirmResetMark[currentLang])) { + let data = getData(FGO_STORAGE); + data.forEach(u => u.mark = 0); + setData(FGO_STORAGE, data.filter(u => u.npLv > 0 || u.lv120 > 0 || u.crowned > 0)); + location.reload(); + } + }; + + document.getElementById('breakthrough').onclick = () => { npLv = (npLv === init_npLv) ? 20 : init_npLv; alert(`${i18n.alertNpLimit[currentLang]}${npLv}`); }; + document.getElementById('open-image-btn').onclick = openImage; + const importFile = document.getElementById('import-file'); + document.getElementById('import-button').onclick = () => importFile.click(); + document.getElementById('export-button').onclick = exportData; + importFile.onchange = importData; +} + +// =================================================================================== +// 3. 輔助與繪圖函式區 (Helper & Drawing Functions) +// =================================================================================== + +function getFontString(size = 20) { + switch (currentLang) { + case 'ja': + return `${size}px -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium', 'Yu Gothic Medium', 'メイリオ', Meiryo, sans-serif`; + case 'en': + return `${size}px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif`; + case 'zh-TW': + default: + return `${size}px -apple-system, BlinkMacSystemFont, 'PingFang TC', 'Microsoft JhengHei', '微軟正黑體', sans-serif`; + } +} + +function switchAccount() { + toggleAccount(); + mainLogic(1); +} + +function updateUnitsNPLevel(units) { + const fgoStorage = getData(FGO_STORAGE); + const storageMap = new Map(); + fgoStorage.forEach(unit => storageMap.set(String(unit.no), unit)); + + units.flat().forEach(unit => { + if(unit) { + const saved = storageMap.get(String(unit.no)); + if (saved) { + unit.npLv = saved.npLv; + unit.mark = saved.mark; + unit.lv120 = saved.lv120 || 0; + unit.crowned = saved.crowned || 0; + } else { + unit.npLv = 0; + unit.mark = 0; + unit.lv120 = 0; + unit.crowned = 0; + } + } + }); +} + +function preloadStaticImages(callback) { + const classIds = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,19,666,1001,1002,1004,1005,99,888]; + let loadedCount = 0; + const total = classIds.length + Marks.length; + const onImageLoad = () => { + loadedCount++; + if (loadedCount === total) callback(); + }; + classIds.forEach((id, i) => { + categoryImages[i] = new Image(); + categoryImages[i].src = `images/class/class_${id}.png`; + categoryImages[i].onload = onImageLoad; + categoryImages[i].onerror = onImageLoad; + }); + window.classes = classIds; + Marks.forEach((mark, i) => { + markImages[i] = new Image(); + markImages[i].src = `images/mark/${mark}.png`; + markImages[i].onload = onImageLoad; + markImages[i].onerror = onImageLoad; + }); +} + +function Checked(btns, ckbtn){ + btns.forEach(btn => { if (btn === ckbtn) { btn.classList.remove('btn--primary'); btn.classList.add('btn--checked'); } + else { btn.classList.remove('btn--checked'); btn.classList.add('btn--primary'); } }); } + +function drawImage(x, y, image){ + const xPos = x * (CELL_SIZE + col_padding) + marginLeft, yPos = y * (CELL_SIZE + row_padding) + marginTop; + if(image && image.complete && image.naturalHeight !== 0){ + try{ context.drawImage(image, xPos, yPos, CELL_SIZE, CELL_SIZE); } + catch(e) { console.error("圖片繪製失敗 (catch):", image.src, e); drawPlaceholder(xPos, yPos); } + } else { + drawPlaceholder(xPos, yPos); + } +} + +function drawPlaceholder(xPos, yPos) { + context.fillStyle = '#AAA'; context.fillRect(xPos, yPos, CELL_SIZE, CELL_SIZE); + context.fillStyle = '#FFF'; context.font = `bold ${CELL_SIZE * 0.6}px Arial`; context.textAlign = "center"; context.textBaseline = "middle"; + context.fillText("?", xPos + CELL_SIZE / 2, yPos + CELL_SIZE / 2); + context.textAlign = "start"; context.textBaseline = "alphabetic"; +} + +function fillCaculate(){ + context.font = getFontString(12); + var have = 0, haveFull = 0, like = 0, percent = 0, ex = 0; + var lucky_bag = (country != 'jp' && country != 'tw' && country != 'z'); + var default_cat1 = lucky_bag ? (CategoryLen - 1):7, default_cat2 = lucky_bag ? (CategoryLen - 1):6; + context.fillStyle = bgcolor; context.fillRect(0, 0, caculateField + 10, canvas.height); context.fillStyle = font_color; + let pass = 0; + for(var category = 0; category < CategoryLen; category++){ + if (CategoryNum[category] === 0) { pass++; continue; } + if (category <= default_cat1) have = 0, haveFull = 0, like = 0; + for(var attribute = 0; attribute < CategoryNum[category]; attribute++){ + if (units[category][attribute].npLv){ have++; if(units[category][attribute].npLv >= 5) haveFull++; } + if (units[category][attribute].mark == 2) like++; + } + if (category <= default_cat2){ + if(attribute>0){ + const yPos = marginTop + (category - pass) * (CELL_SIZE + row_padding), centerY = yPos + (CELL_SIZE / 2); + context.textBaseline = 'middle'; + percent = ((1 - (have / attribute)) * 100); + context.fillText(`${i18n.expectNew[currentLang]}:${percent.toFixed(2)}%`, marginLeft - caculateField, centerY - 15); + percent = (haveFull / units[category].length * 100); + context.fillText(`${i18n.expectRegret[currentLang]}:${percent.toFixed(2)}%`, marginLeft - caculateField, centerY); + percent = (like / units[category].length * 100); + context.fillText(`${i18n.expectLove[currentLang]}:${percent.toFixed(2)}%`, marginLeft - caculateField, centerY + 15); + context.textBaseline = 'alphabetic'; + } + }else { ex += units[category].length; } + } + if(!lucky_bag){ + const yPos = marginTop + 7 * (CELL_SIZE + row_padding), centerY = yPos + (CELL_SIZE / 2); + context.textBaseline = 'middle'; + percent = ((1 - (have / ex)) * 100); + context.fillText(`${i18n.expectNew[currentLang]}:${percent.toFixed(2)}%`, marginLeft - caculateField, centerY - 15); + percent = (haveFull / ex * 100); + context.fillText(`${i18n.expectRegret[currentLang]}:${percent.toFixed(2)}%`, marginLeft - caculateField, centerY); + percent = (like / ex * 100); + context.fillText(`${i18n.expectLove[currentLang]}:${percent.toFixed(2)}%`, marginLeft - caculateField, centerY + 15); + context.textBaseline = 'alphabetic'; + } +} +function fillRect(x, y, color){ context.fillStyle = color; context.fillRect ((x + 1) * (CELL_SIZE + col_padding) + marginLeft, y * (CELL_SIZE + row_padding) + marginTop, CELL_SIZE, CELL_SIZE); } +function fillTextMask(x, y, color){ context.fillStyle = color; context.fillRect(x * (CELL_SIZE + col_padding) + marginLeft, (y + 1) * (CELL_SIZE + row_padding) - row_padding + marginTop, CELL_SIZE, row_padding); } +function fillNPText(x, y, msg) { + context.font = getFontString(20); + let number = msg.match(/\d+/)[0]; + context.fillStyle = (number == 5) ? "rgb(255, 255, 0)" : (number >= 6) ? "rgb(255, 0, 0)" : font_color; + context.textBaseline = 'top'; + const textWidth = context.measureText(msg).width; + const xPos = (x + 1) * (CELL_SIZE + col_padding) + marginLeft + (CELL_SIZE - textWidth) / 2; + const yPos = y * (CELL_SIZE + row_padding) + marginTop + CELL_SIZE + 5; + context.fillText(msg, xPos, yPos); + context.textBaseline = 'alphabetic'; +} + +function fillTotalText() { + context.font = getFontString(18); + + var totalHave = 0, totalNP = 0, total = 0, totalNP5 = 0; + for (let i = 0; i < CategoryLen; i++) { + total += CategoryNum[i]; + for (let j = 0; j < CategoryNum[i]; j++) { + if (units[i][j]) { + const unit = units[i][j]; + totalNP += unit.npLv; + if (unit.npLv > 0) totalHave++; + if (unit.npLv >= 5) totalNP5++; + } + } + } + var percent = total > 0 ? (totalHave / total) * 100 : 0; + var percentNP5 = total > 0 ? (totalNP5 / total) * 100 : 0; + + let boxWidth; + switch (currentLang) { + case 'zh-TW': boxWidth = 220; break; + case 'en': boxWidth = 260; break; + case 'ja': boxWidth = 300; break; + default: boxWidth = 220; + } + + const boxHeight = 140; + const boxX = canvas.width - boxWidth; + const boxY = canvas.height - 170; + context.fillStyle = bgcolor; + context.fillRect(boxX, boxY, boxWidth, boxHeight); + + context.textAlign = 'left'; + context.fillStyle = font_color; + const xPos = boxX + 10; + const lineSpacing = 25; + + let currentY = boxY + 15; + + const line_np5_owned = `${i18n.totalNP5Owned[currentLang]}: ${totalNP5}/${total}`; + context.fillText(line_np5_owned, xPos, currentY); + currentY += lineSpacing; + + const line_np5_rate_label = `${i18n.ownedNP5Rate[currentLang]}: `; + const line_np5_rate_value = `${percentNP5.toFixed(2)}%`; + let valueColorNP5 = font_color; + if (percentNP5 >= 100) valueColorNP5 = "gold"; + else if (percentNP5 >= 90) valueColorNP5 = "red"; + else if (percentNP5 >= 75) valueColorNP5 = "purple"; + else if (percentNP5 >= 50) valueColorNP5 = "blue"; + else if (percentNP5 >= 25) valueColorNP5 = "green"; + + context.fillStyle = font_color; + context.fillText(line_np5_rate_label, xPos, currentY); + const labelWidthNP5 = context.measureText(line_np5_rate_label).width; + context.fillStyle = valueColorNP5; + context.fillText(line_np5_rate_value, xPos + labelWidthNP5, currentY); + currentY += lineSpacing; + + context.fillStyle = font_color; + const line_total_owned = `${i18n.totalOwned[currentLang]}: ${totalHave}/${total}`; + context.fillText(line_total_owned, xPos, currentY); + currentY += lineSpacing; + + const line_owned_rate_label = `${i18n.ownedRate[currentLang]}: `; + const line_owned_rate_value = `${percent.toFixed(2)}%`; + let valueColor = font_color; + if (percent >= 100) valueColor = "gold"; + else if (percent >= 90) valueColor = "red"; + else if (percent >= 75) valueColor = "purple"; + else if (percent >= 50) valueColor = "blue"; + else if (percent >= 25) valueColor = "green"; + + context.fillStyle = font_color; + context.fillText(line_owned_rate_label, xPos, currentY); + const labelWidthOwned = context.measureText(line_owned_rate_label).width; + context.fillStyle = valueColor; + context.fillText(line_owned_rate_value, xPos + labelWidthOwned, currentY); + currentY += lineSpacing; + + context.fillStyle = font_color; + const line_total_np = `${i18n.totalNPLevel[currentLang]}: ${totalNP}`; + context.fillText(line_total_np, xPos, currentY); + + + context.textAlign = 'start'; +} + +// 繪製外框的函式 (取代 drawCrownedBorder) +function drawUnitBorder(x, y, color) { + const xPos = x * (CELL_SIZE + col_padding) + marginLeft; + const yPos = y * (CELL_SIZE + row_padding) + marginTop; + context.strokeStyle = color; // 使用傳入的顏色 + context.lineWidth = 3; // 稍粗的線條 + // 在圖示內部繪製外框,避免清除問題 + context.strokeRect(xPos + 1.5, yPos + 1.5, CELL_SIZE - 3, CELL_SIZE - 3); + context.lineWidth = 1; // 重設線條寬度 +} + +// 【移除】fillLv120Text 函式 (不再需要) +/* +function fillLv120Text(x, y) { +... +} +*/ + +function getCoordinates(e){ const rect = e.target.getBoundingClientRect(); const scaleX = canvas.width / rect.width; const scaleY = canvas.height / rect.height; return {'x': (e.clientX - rect.left) * scaleX, 'y': (e.clientY - rect.top) * scaleY}; } +function getCategory(y){ return Math.floor((y - marginTop) / (CELL_SIZE + row_padding)); } +function getAttribute(x){ return Math.floor((x - marginLeft) / (CELL_SIZE + col_padding)); } + +function handleUnitInteraction(event, isRightClick = false) { + const point = getCoordinates(event); + let categoryIndex = getCategory(point.y); + let attributeIndex = getAttribute(point.x); + + let visibleCategoryIndex = 0; + let actualCategoryIndex = -1; + for (let i = 0; i < CategoryLen; i++) { + if (CategoryNum[i] > 0) { + if (visibleCategoryIndex === categoryIndex) { + actualCategoryIndex = i; + break; + } + visibleCategoryIndex++; + } + } + if (actualCategoryIndex === -1) return; + + if (attributeIndex === 0) { + if (isRightClick) return; + + if (selectedClasses.has(actualCategoryIndex)) { + selectedClasses.delete(actualCategoryIndex); + } else { + selectedClasses.add(actualCategoryIndex); + } + drawCanvas(); + return; + } + + categoryIndex = actualCategoryIndex; + const xInCell = point.x - (attributeIndex * (CELL_SIZE + col_padding) + marginLeft); + const yInCell = point.y - (getCategory(point.y) * (CELL_SIZE + row_padding) + marginTop); + + if (xInCell < CELL_SIZE && xInCell > 0 && yInCell < CELL_SIZE && yInCell > 0 && attributeIndex > 0 && attributeIndex <= CategoryNum[categoryIndex]) { + const unit = units[categoryIndex][attributeIndex - 1]; + const yPos = getCategory(point.y); + + // + switch(mode) { + case 0: // NP 等級 + if (isRightClick) { + if (unit.npLv === 0) unit.npLv = npLv; + else unit.npLv--; + } else { + unit.npLv = unit.npLv < npLv ? unit.npLv + 1 : 0; + } + break; + case 1: // 標記 + if (isRightClick) unit.mark = unit.mark > 0 ? unit.mark - 1 : Marks.length; + else unit.mark = (unit.mark + 1) % (Marks.length + 1); + break; + case 2: // Lv120 (左右鍵都當作開關) + unit.lv120 = !unit.lv120 ? 1 : 0; // 1 = true, 0 = false + break; + case 3: // 戴冠 (左右鍵都當作開關) + unit.crowned = !unit.crowned ? 1 : 0; + break; + } + + // 點擊後的重繪邏輯 + + // 1. 重繪基本圖示 (這會清除舊的疊加效果) + drawImage(attributeIndex, yPos, unit.image); + + // 2. 繪製遮罩或NP等級 + if (!unit.npLv) { + fillTextMask(attributeIndex, yPos, bgcolor); // 清除NP文字區域 + fillRect(attributeIndex - 1, yPos, mask); // 畫上遮罩 + } + else { + fillTextMask(attributeIndex, yPos, bgcolor); // 清除NP文字區域 + fillNPText(attributeIndex - 1, yPos, `${i18n.npLevelPrefix[currentLang]}${unit.npLv}`); // 畫上NP文字 + } + + // 繪製所有疊加效果 (戴冠、標記、120等) + const is120 = unit.lv120; + const isCrowned = unit.crowned; + if (is120 && isCrowned) { + drawUnitBorder(attributeIndex, yPos, "#39C5BB"); // 兩個都有 + } else if (is120) { + drawUnitBorder(attributeIndex, yPos, "#FFE211"); // 只有120 + } else if (isCrowned) { + drawUnitBorder(attributeIndex, yPos, "#0000FF"); // 只有戴冠 + } + + if (unit.mark) drawImage(attributeIndex, yPos, markImages[unit.mark - 1]); + + fillTotalText(); + if(luckyBag) fillCaculate(); + updateData(units); + } +} + +function rightClick(e){ handleUnitInteraction(e, true); } +function onCanvasClick(e){ handleUnitInteraction(e, false); } + +function exportData() { + const accountName = getCurrentAccount(); + const data = getData(FGO_STORAGE); + if (data.length === 0) { + alert("目前帳號沒有資料可匯出。"); + return; + } + + const jsonString = JSON.stringify(data, null, 2); + const blob = new Blob([jsonString], { type: "application/json" }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = `fgo_5star_data_${accountName}.json`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); +} + +function importData(event) { + const file = event.target.files[0]; + if (!file) { + return; + } + + const reader = new FileReader(); + reader.onload = function(e) { + try { + const importedData = JSON.parse(e.target.result); + if (!Array.isArray(importedData)) { + throw new Error("Data is not an array."); + } + if (confirm(i18n.confirmImport[currentLang])) { + setData(FGO_STORAGE, importedData); + alert(i18n.successImport[currentLang]); + location.reload(); + } + } catch (error) { + console.error("Import failed:", error); + alert(i18n.errorImport[currentLang]); + } finally { + event.target.value = null; + } + }; + reader.readAsText(file); +} + +function openImage(){ + try{ + const image = new Image(); + const canvas = document.getElementById("canvas"); + image.src = canvas.toDataURL("image/png"); + window.open().document.write(''); + }catch(e){ + if (e.name === "SecurityError") alert(i18n.errorSecurity[currentLang]); + else alert(`${i18n.errorGenerateImage[currentLang]}${e}`); + } +} +function getLanguage() { + const savedLang = localStorage.getItem('fgo5s-lang'); + if (savedLang && i18n.pageTitle[savedLang]) return savedLang; + const browserLang = navigator.language; + if (browserLang.startsWith('ja')) return 'ja'; + if (browserLang.startsWith('en')) return 'en'; + return 'zh-TW'; +} + +function setLanguage(lang) { + currentLang = lang; + localStorage.setItem('fgo5s-lang', lang); + applyLanguage(lang); + + if (canvas && context) { + drawCanvas(); + } +} + +function applyLanguage(lang) { + document.querySelectorAll('[data-i18n-key]').forEach(el => { + const key = el.getAttribute('data-i18n-key'); + if (i18n[key] && i18n[key][lang]) { + el.innerText = i18n[key][lang]; + } + }); + Object.keys(FGO_DATA).forEach(modeKey => { + const modeData = FGO_DATA[modeKey]; + if (modeData.labelKey) { + const buttonId = ['jp', 'tw', 'z'].includes(modeKey) ? `${modeKey}-button` : modeKey; + const button = document.getElementById(buttonId); + if (button && i18n[modeData.labelKey] && i18n[modeData.labelKey][lang]) { + button.innerText = i18n[modeData.labelKey][lang]; + } + } + }); +} \ No newline at end of file diff --git a/luckybag.json b/luckybag.json new file mode 100644 index 0000000..5272948 --- /dev/null +++ b/luckybag.json @@ -0,0 +1,201 @@ +{ + "eighth_servants": { + "saber": [285, 292, 284, 289], + "archer": [299, 303, 297, 295], + "lancer": [309, 312, 307, 305], + "rider": [321, 314, 317], + "caster": [327, 334, 324], + "assassin": [337, 339, 349, 336], + "berserker": [353, 351, 355, 357], + "ruler": [362, 373, 365, 368], + "avenger": [374, 376, 384, 383], + "alterego": [297, 302, 303], + "foreigner": [342, 329, 316, 343, 346], + "mooncancer": [369, 375, 371] + }, + "nineth_servants": { + "saber": [303, 299, 297], + "archer": [316, 309, 312, 284], + "lancer": [346, 343, 342, 374], + "rider": [314, 371, 373], + "caster": [368, 383, 384, 409], + "assassin": [393, 324, 295], + "berserker": [349, 365, 307], + "ruler": [317, 416, 337], + "avenger": [369, 334, 402, 302], + "alterego": [406, 336, 305], + "mooncancer": [289, 321, 285], + "foreigner": [355, 357, 353], + "pretender": [386, 390, 385], + "beast": [292, 329, 327], + "unbeast": [375, 362, 397, 400], + "shielder": [394, 351, 376, 339], + "luckybag1": [415, 403, 413] + }, + "newyear_24_up_servants": { + "saber": [86, 70, 163, 155, 68], + "archer": [303, 179, 239, 270], + "lancer": [384, 393, 336, 327], + "rider": [276, 297, 324, 317, 305], + "caster": [362, 368, 365, 357], + "assassin": [234, 129, 90, 275], + "berserker": [386, 400, 312, 337], + "ruler": [284, 241, 215, 229], + "avenger": [307, 353, 295], + "alterego": [127, 91, 198, 167, 112], + "foreigner": [253, 261, 216, 237], + "mooncancer": [285, 268, 321, 349], + "pretender": [355, 383, 390, 374], + "beast": [88, 136, 106, 128], + "shielder": [292, 195, 339, 153] + }, + "newyear_24_down_servants": { + "saber": [142, 139, 175, 114, 196], + "archer": [220, 238, 209, 199, 250], + "lancer": [265, 299, 280, 289], + "rider": [314, 309, 334, 312], + "caster": [373, 351, 385, 376], + "assassin": [303, 393, 270], + "berserker": [297, 375, 96, 343, 281], + "ruler": [272, 173, 229, 150], + "avenger": [346, 329, 302], + "alterego": [369, 394, 371], + "foreigner": [51, 154, 161, 156], + "mooncancer": [213, 394, 342], + "pretender": [205, 12, 93, 160, 108], + "beast": [247, 397, 280, 316] + }, + "newyear_25_up_servants": { + "saber": [68, 70, 270, 276], + "archer": [317, 368, 384], + "lancer": [90, 129, 91, 216, 234], + "rider": [337, 312, 402, 383], + "caster": [142, 88, 153, 128], + "assassin": [196, 280, 312, 299], + "berserker": [327, 239, 179, 86, 155], + "ruler": [415, 362, 365, 406], + "avenger": [112, 127, 237, 253], + "alterego": [386, 355, 349, 261], + "foreigner": [136, 175, 139, 114], + "mooncancer": [314, 385, 199, 309], + "pretender": [284, 307, 241, 215], + "beast": [324, 297, 163, 303, 305] + }, + "newyear_25_down_servants": { + "saber": [426, 416, 357, 393, 403], + "archer": [167, 268, 275, 198], + "lancer": [285, 374, 390, 321], + "rider": [413, 421, 400], + "caster": [220, 209, 195, 106], + "assassin": [250, 238, 265, 289], + "berserker": [334, 351, 339, 373], + "ruler": [431, 418, 376], + "avenger": [292, 295, 336, 229], + "alterego": [353, 421, 413] + }, + "newyear_25_white_servants": { + "saber": [270, 343, 375], + "archer": [402, 427, 394, 302, 329], + "lancer": [156, 12, 160], + "rider": [213, 394, 280], + "caster": [96, 281, 297], + "assassin": [409, 393, 303], + "berserker": [346, 371, 369], + "ruler": [51, 108, 93], + "avenger": [161, 205, 154], + "alterego": [316, 397, 247], + "foreigner": [229, 173, 272, 342, 150] + }, + "tenth_up_servants": { + "saber": [68, 213, 90, 153], + "archer": [270, 337, 234, 384], + "lancer": [160, 299, 302, 91], + "rider": [317, 343, 402, 432], + "caster": [129, 156, 272, 427, 394], + "assassin": [142, 12, 216], + "berserker": [276, 375, 383, 394], + "ruler": [312, 70, 128, 433, 88], + "avenger": [196, 280, 312], + "alterego": [442, 329, 368] + }, + "tenth_down_servants": { + "saber": [179, 342, 241], + "archer": [205, 108, 253], + "lancer": [406, 349, 397], + "rider": [136, 215, 150], + "caster": [284, 327, 307], + "assassin": [175, 237, 127], + "berserker": [435, 385, 415], + "ruler": [239, 86, 154], + "avenger": [139, 112, 199], + "alterego": [365, 371, 314], + "foreigner": [51, 155, 386, 161, 440], + "mooncancer": [247, 114, 261], + "pretender": [355, 362, 309] + }, + "tenth_ex_servants": { + "saber": [400, 409, 106, 303, 418], + "archer": [229, 173, 292, 421], + "lancer": [93, 96, 220], + "rider": [265, 268, 250], + "caster": [305, 321, 285], + "assassin": [374, 357, 346, 351], + "berserker": [438, 390, 403, 421], + "ruler": [163, 195, 275], + "avenger": [339, 393, 431], + "alterego": [336, 413, 295, 353], + "foreigner": [209, 167, 198], + "mooncancer": [238, 289, 281], + "pretender": [297, 324, 316], + "beast": [369, 376, 373, 334], + "unbeast": [416, 426, 413, 441] + }, + "newyear_26_up_servants": { + "saber": [68, 90, 91], + "archer": [270, 234, 153], + "lancer": [299, 317, 337], + "rider": [445, 384, 402], + "caster": [129, 142, 216], + "assassin": [276, 383, 450], + "berserker": [70, 128, 88], + "ruler": [196, 312, 280], + "avenger": [442, 457, 433, 368], + "alterego": [179, 406, 349, 241, 253], + "mooncancer": [136, 175, 127], + "foreigner": [284, 215, 307, 237], + "pretender": [327, 435, 385, 415], + "beast": [139, 112, 199, 86], + "unbeast": [239, 453, 365, 314], + "shielder": [155, 114, 261, 309], + "luckybag1": [386, 355, 362, 440] + }, + "newyear_26_down_servants": { + "saber": [229, 106, 220], + "archer": [265, 268, 250], + "lancer": [292, 303, 285], + "rider": [305, 321, 351], + "caster": [374, 357, 390], + "assassin": [400, 403, 418], + "berserker": [438, 448, 421], + "ruler": [167, 163, 195], + "avenger": [209, 238, 198], + "alterego": [289, 295, 275], + "mooncancer": [297, 324, 334], + "foreigner": [339, 336, 353], + "pretender": [376, 413, 373, 393], + "beast": [416, 426, 441, 431] + }, + "newyear_26_white_servants": { + "saber": [160, 270, 213, 302], + "archer": [456, 343, 402, 432], + "lancer": [12, 156, 272], + "rider": [375, 427, 394], + "caster": [442, 329, 280], + "assassin": [205, 108, 342, 397, 452], + "berserker": [150, 371, 154], + "ruler": [247, 51, 161], + "avenger": [93, 173, 96], + "alterego": [346, 229, 409, 303], + "mooncancer": [297, 369, 281, 393, 316] + } +} \ No newline at end of file diff --git a/main.css b/main.css index 538eb2b..17ca4f6 100644 --- a/main.css +++ b/main.css @@ -1,69 +1,117 @@ -body{ +/* 【修改點】移除所有 @font-face 規則,不再載入任何網頁字型 */ +/* +@font-face { + font-family: 'Noto Sans TC'; + src: url('./fonts/NotoSansTC-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Noto Sans JP'; + src: url('./fonts/NotoSansJP-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +*/ + +body { background-color: #999; - font-family: Arial,"微軟正黑體"; + /* 【修改點】更新 font-family 規則,使用一個更全面的系統字型組合。 + 這個順序會為不同作業系統(Apple, Windows)和不同語言(英文、繁中、日文) + 提供最優先且美觀的預設字型。 + */ + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Microsoft JhengHei", "微軟正黑體", "Segoe UI", Roboto, "Hiragino Sans", "Hiragino Kaku Gothic ProN", "游ゴシック Medium", "Yu Gothic Medium", "メイリオ", Meiryo, sans-serif; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; -} + margin: 0; + padding: 0; + } #header { margin: 0 auto; - width:700px; + max-width: 90%; + text-align: center; } #header h1 { display: block; - width: 700px; - height: 20px; - text-align: center; + width: 100%; + height: auto; + font-size: 2em; } #nav { - width: :700px; + max-width: 90%; margin: 0 auto; overflow: hidden; text-align: center; } #nav ul { - display: inline-block; - margin: 10 auto; + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 10px 0; padding: 0; list-style: none; } #nav li { - float: left; - list-style-type: none; - margin-right: 20px + margin: 5px; } #footer { margin: 0 auto; + max-width: 90%; + text-align: center; } #footer h2 { - font-size: 15px; + font-size: 1em; text-align: center; } +/* 新增: 語言切換器樣式 */ +#language-switcher { + margin-top: 15px; + padding-bottom: 15px; +} + +#language-switcher a { + color: #333; + text-decoration: none; + padding: 5px 10px; + border-radius: 5px; + transition: background-color 0.3s; +} + +#language-switcher a:hover { + background-color: #bbb; +} + + .btn { text-transform: uppercase; - padding: 10px 40px; + padding: 10px 20px; text-decoration: none; color: #fff; letter-spacing: 1px; display: inline-block; + font-size: 1em; } .btn--primary { - background: #000000 ; - transition: all .3s; + background: #000; + transition: all 0.3s; } .btn--primary:hover { - background: #2b3033; + background: #2b3033; } .btn--round { @@ -71,20 +119,52 @@ body{ } .btn--checked { - background: #b03a2e ; - transition: all .3s; + background: #b03a2e; + transition: all 0.3s; } .btn--checked:hover { - background: #C93E2F; + background: #c93e2f; } - canvas { padding-left: 0; padding-right: 0; margin-left: auto; margin-right: auto; display: block; - width: 700; -} \ No newline at end of file + width: auto; /* 讓寬度自動調整 */ + max-width: 100%; /* 確保不會超出螢幕寬度 */ +} + +/* Media Queries for Responsive Design */ +@media (max-width: 768px) { + #header h1 { + font-size: 1.5em; + } + + .btn { + padding: 8px 15px; + font-size: 0.9em; + } + + #nav ul { + flex-direction: column; + align-items: center; + } + + #nav li { + margin: 10px 0; + } +} + +@media (max-width: 480px) { + #header h1 { + font-size: 1.2em; + } + + .btn { + padding: 5px 10px; + font-size: 0.8em; + } +} diff --git a/missing_servants.txt b/missing_servants.txt new file mode 100644 index 0000000..ad43a93 --- /dev/null +++ b/missing_servants.txt @@ -0,0 +1 @@ +[MISS] カレン・C・オルテンシア(アムール〔カレン〕) (Class: Ruler) -> Key: Rulerカレン・C・オルテンシア(アムール〔カレン〕) \ No newline at end of file diff --git a/module/fgoStorage.js b/module/fgoStorage.js new file mode 100644 index 0000000..e69de29 diff --git a/svt/01_saber/153.png b/svt/01_saber/153.png new file mode 100644 index 0000000..ccc6bcd Binary files /dev/null and b/svt/01_saber/153.png differ diff --git a/svt/01_saber/160.png b/svt/01_saber/160.png new file mode 100644 index 0000000..d019f9e Binary files /dev/null and b/svt/01_saber/160.png differ diff --git a/svt/01_saber/2.png b/svt/01_saber/2.png new file mode 100644 index 0000000..d14a5c6 Binary files /dev/null and b/svt/01_saber/2.png differ diff --git a/svt/01_saber/213.png b/svt/01_saber/213.png new file mode 100644 index 0000000..8bca109 Binary files /dev/null and b/svt/01_saber/213.png differ diff --git a/svt/01_saber/234.png b/svt/01_saber/234.png new file mode 100644 index 0000000..d7190e1 Binary files /dev/null and b/svt/01_saber/234.png differ diff --git a/svt/01_saber/270.png b/svt/01_saber/270.png new file mode 100644 index 0000000..6f064ff Binary files /dev/null and b/svt/01_saber/270.png differ diff --git a/svt/01_saber/278.png b/svt/01_saber/278.png new file mode 100644 index 0000000..4288c32 Binary files /dev/null and b/svt/01_saber/278.png differ diff --git a/svt/01_saber/299.png b/svt/01_saber/299.png new file mode 100644 index 0000000..3e548d3 Binary files /dev/null and b/svt/01_saber/299.png differ diff --git a/svt/01_saber/302.png b/svt/01_saber/302.png new file mode 100644 index 0000000..c2c63bb Binary files /dev/null and b/svt/01_saber/302.png differ diff --git a/svt/01_saber/317.png b/svt/01_saber/317.png new file mode 100644 index 0000000..6fe4f19 Binary files /dev/null and b/svt/01_saber/317.png differ diff --git a/svt/01_saber/337.png b/svt/01_saber/337.png new file mode 100644 index 0000000..74df315 Binary files /dev/null and b/svt/01_saber/337.png differ diff --git a/svt/01_saber/343.png b/svt/01_saber/343.png new file mode 100644 index 0000000..a283fe7 Binary files /dev/null and b/svt/01_saber/343.png differ diff --git a/svt/01_saber/384.png b/svt/01_saber/384.png new file mode 100644 index 0000000..3b32c5b Binary files /dev/null and b/svt/01_saber/384.png differ diff --git a/svt/01_saber/402.png b/svt/01_saber/402.png new file mode 100644 index 0000000..feb7d60 Binary files /dev/null and b/svt/01_saber/402.png differ diff --git a/svt/01_saber/432.png b/svt/01_saber/432.png new file mode 100644 index 0000000..728de25 Binary files /dev/null and b/svt/01_saber/432.png differ diff --git a/svt/01_saber/445.png b/svt/01_saber/445.png new file mode 100644 index 0000000..e3157f9 Binary files /dev/null and b/svt/01_saber/445.png differ diff --git a/svt/01_saber/456.png b/svt/01_saber/456.png new file mode 100644 index 0000000..9c9214d Binary files /dev/null and b/svt/01_saber/456.png differ diff --git a/svt/01_saber/461.png b/svt/01_saber/461.png new file mode 100644 index 0000000..3705e55 Binary files /dev/null and b/svt/01_saber/461.png differ diff --git a/svt/01_saber/68.png b/svt/01_saber/68.png new file mode 100644 index 0000000..47420cc Binary files /dev/null and b/svt/01_saber/68.png differ diff --git a/svt/01_saber/76.png b/svt/01_saber/76.png new file mode 100644 index 0000000..39c70cd Binary files /dev/null and b/svt/01_saber/76.png differ diff --git a/svt/01_saber/8.png b/svt/01_saber/8.png new file mode 100644 index 0000000..df98986 Binary files /dev/null and b/svt/01_saber/8.png differ diff --git a/svt/01_saber/90.png b/svt/01_saber/90.png new file mode 100644 index 0000000..b80ddbc Binary files /dev/null and b/svt/01_saber/90.png differ diff --git a/svt/01_saber/91.png b/svt/01_saber/91.png new file mode 100644 index 0000000..2d86cc5 Binary files /dev/null and b/svt/01_saber/91.png differ diff --git a/svt/02_archer/12.png b/svt/02_archer/12.png new file mode 100644 index 0000000..98f1c4e Binary files /dev/null and b/svt/02_archer/12.png differ diff --git a/svt/02_archer/129.png b/svt/02_archer/129.png new file mode 100644 index 0000000..b787f99 Binary files /dev/null and b/svt/02_archer/129.png differ diff --git a/svt/02_archer/142.png b/svt/02_archer/142.png new file mode 100644 index 0000000..94ffef6 Binary files /dev/null and b/svt/02_archer/142.png differ diff --git a/svt/02_archer/156.png b/svt/02_archer/156.png new file mode 100644 index 0000000..5f603d0 Binary files /dev/null and b/svt/02_archer/156.png differ diff --git a/svt/02_archer/212.png b/svt/02_archer/212.png new file mode 100644 index 0000000..afdc835 Binary files /dev/null and b/svt/02_archer/212.png differ diff --git a/svt/02_archer/216.png b/svt/02_archer/216.png new file mode 100644 index 0000000..045e47e Binary files /dev/null and b/svt/02_archer/216.png differ diff --git a/svt/02_archer/272.png b/svt/02_archer/272.png new file mode 100644 index 0000000..a0039e3 Binary files /dev/null and b/svt/02_archer/272.png differ diff --git a/svt/02_archer/276.png b/svt/02_archer/276.png new file mode 100644 index 0000000..8fd494d Binary files /dev/null and b/svt/02_archer/276.png differ diff --git a/svt/02_archer/350.png b/svt/02_archer/350.png new file mode 100644 index 0000000..d2f9b1b Binary files /dev/null and b/svt/02_archer/350.png differ diff --git a/svt/02_archer/375.png b/svt/02_archer/375.png new file mode 100644 index 0000000..9566fcd Binary files /dev/null and b/svt/02_archer/375.png differ diff --git a/svt/02_archer/383.png b/svt/02_archer/383.png new file mode 100644 index 0000000..de236a9 Binary files /dev/null and b/svt/02_archer/383.png differ diff --git a/svt/02_archer/394.png b/svt/02_archer/394.png new file mode 100644 index 0000000..0d6c4cf Binary files /dev/null and b/svt/02_archer/394.png differ diff --git a/svt/02_archer/427.png b/svt/02_archer/427.png new file mode 100644 index 0000000..d3bd8cb Binary files /dev/null and b/svt/02_archer/427.png differ diff --git a/svt/02_archer/450.png b/svt/02_archer/450.png new file mode 100644 index 0000000..3b8feee Binary files /dev/null and b/svt/02_archer/450.png differ diff --git a/svt/02_archer/60.png b/svt/02_archer/60.png new file mode 100644 index 0000000..162abc6 Binary files /dev/null and b/svt/02_archer/60.png differ diff --git a/svt/02_archer/77.png b/svt/02_archer/77.png new file mode 100644 index 0000000..dc0f132 Binary files /dev/null and b/svt/02_archer/77.png differ diff --git a/svt/02_archer/84.png b/svt/02_archer/84.png new file mode 100644 index 0000000..2ab78e9 Binary files /dev/null and b/svt/02_archer/84.png differ diff --git a/svt/03_lancer/119.png b/svt/03_lancer/119.png new file mode 100644 index 0000000..bbb27c3 Binary files /dev/null and b/svt/03_lancer/119.png differ diff --git a/svt/03_lancer/128.png b/svt/03_lancer/128.png new file mode 100644 index 0000000..6e35835 Binary files /dev/null and b/svt/03_lancer/128.png differ diff --git a/svt/03_lancer/143.png b/svt/03_lancer/143.png new file mode 100644 index 0000000..720e54d Binary files /dev/null and b/svt/03_lancer/143.png differ diff --git a/svt/03_lancer/196.png b/svt/03_lancer/196.png new file mode 100644 index 0000000..39086e3 Binary files /dev/null and b/svt/03_lancer/196.png differ diff --git a/svt/03_lancer/232.png b/svt/03_lancer/232.png new file mode 100644 index 0000000..09618e5 Binary files /dev/null and b/svt/03_lancer/232.png differ diff --git a/svt/03_lancer/280.png b/svt/03_lancer/280.png new file mode 100644 index 0000000..81eb7a3 Binary files /dev/null and b/svt/03_lancer/280.png differ diff --git a/svt/03_lancer/300.png b/svt/03_lancer/300.png new file mode 100644 index 0000000..92ecc96 Binary files /dev/null and b/svt/03_lancer/300.png differ diff --git a/svt/03_lancer/312.png b/svt/03_lancer/312.png new file mode 100644 index 0000000..7bf8563 Binary files /dev/null and b/svt/03_lancer/312.png differ diff --git a/svt/03_lancer/329.png b/svt/03_lancer/329.png new file mode 100644 index 0000000..5b2dceb Binary files /dev/null and b/svt/03_lancer/329.png differ diff --git a/svt/03_lancer/368.png b/svt/03_lancer/368.png new file mode 100644 index 0000000..d74bbb4 Binary files /dev/null and b/svt/03_lancer/368.png differ diff --git a/svt/03_lancer/381.png b/svt/03_lancer/381.png new file mode 100644 index 0000000..7f394b2 Binary files /dev/null and b/svt/03_lancer/381.png differ diff --git a/svt/03_lancer/433.png b/svt/03_lancer/433.png new file mode 100644 index 0000000..e644d6b Binary files /dev/null and b/svt/03_lancer/433.png differ diff --git a/svt/03_lancer/442.png b/svt/03_lancer/442.png new file mode 100644 index 0000000..558d693 Binary files /dev/null and b/svt/03_lancer/442.png differ diff --git a/svt/03_lancer/457.png b/svt/03_lancer/457.png new file mode 100644 index 0000000..8546fe2 Binary files /dev/null and b/svt/03_lancer/457.png differ diff --git a/svt/03_lancer/465.png b/svt/03_lancer/465.png new file mode 100644 index 0000000..eb4e1b0 Binary files /dev/null and b/svt/03_lancer/465.png differ diff --git a/svt/03_lancer/70.png b/svt/03_lancer/70.png new file mode 100644 index 0000000..dacae4c Binary files /dev/null and b/svt/03_lancer/70.png differ diff --git a/svt/03_lancer/85.png b/svt/03_lancer/85.png new file mode 100644 index 0000000..758fde8 Binary files /dev/null and b/svt/03_lancer/85.png differ diff --git a/svt/03_lancer/88.png b/svt/03_lancer/88.png new file mode 100644 index 0000000..4c90536 Binary files /dev/null and b/svt/03_lancer/88.png differ diff --git a/svt/04_rider/108.png b/svt/04_rider/108.png new file mode 100644 index 0000000..98575a6 Binary files /dev/null and b/svt/04_rider/108.png differ diff --git a/svt/04_rider/118.png b/svt/04_rider/118.png new file mode 100644 index 0000000..56fea31 Binary files /dev/null and b/svt/04_rider/118.png differ diff --git a/svt/04_rider/144.png b/svt/04_rider/144.png new file mode 100644 index 0000000..05fa5a3 Binary files /dev/null and b/svt/04_rider/144.png differ diff --git a/svt/04_rider/179.png b/svt/04_rider/179.png new file mode 100644 index 0000000..9808e6b Binary files /dev/null and b/svt/04_rider/179.png differ diff --git a/svt/04_rider/205.png b/svt/04_rider/205.png new file mode 100644 index 0000000..03baad1 Binary files /dev/null and b/svt/04_rider/205.png differ diff --git a/svt/04_rider/206.png b/svt/04_rider/206.png new file mode 100644 index 0000000..2247c01 Binary files /dev/null and b/svt/04_rider/206.png differ diff --git a/svt/04_rider/241.png b/svt/04_rider/241.png new file mode 100644 index 0000000..e92f537 Binary files /dev/null and b/svt/04_rider/241.png differ diff --git a/svt/04_rider/253.png b/svt/04_rider/253.png new file mode 100644 index 0000000..21047c7 Binary files /dev/null and b/svt/04_rider/253.png differ diff --git a/svt/04_rider/274.png b/svt/04_rider/274.png new file mode 100644 index 0000000..4bf1489 Binary files /dev/null and b/svt/04_rider/274.png differ diff --git a/svt/04_rider/277.png b/svt/04_rider/277.png new file mode 100644 index 0000000..ddf667f Binary files /dev/null and b/svt/04_rider/277.png differ diff --git a/svt/04_rider/296.png b/svt/04_rider/296.png new file mode 100644 index 0000000..df348e0 Binary files /dev/null and b/svt/04_rider/296.png differ diff --git a/svt/04_rider/331.png b/svt/04_rider/331.png new file mode 100644 index 0000000..e2e98b5 Binary files /dev/null and b/svt/04_rider/331.png differ diff --git a/svt/04_rider/342.png b/svt/04_rider/342.png new file mode 100644 index 0000000..8c8cfc6 Binary files /dev/null and b/svt/04_rider/342.png differ diff --git a/svt/04_rider/349.png b/svt/04_rider/349.png new file mode 100644 index 0000000..308a6ae Binary files /dev/null and b/svt/04_rider/349.png differ diff --git a/svt/04_rider/397.png b/svt/04_rider/397.png new file mode 100644 index 0000000..67b8236 Binary files /dev/null and b/svt/04_rider/397.png differ diff --git a/svt/04_rider/406.png b/svt/04_rider/406.png new file mode 100644 index 0000000..b4459bc Binary files /dev/null and b/svt/04_rider/406.png differ diff --git a/svt/04_rider/452.png b/svt/04_rider/452.png new file mode 100644 index 0000000..8113585 Binary files /dev/null and b/svt/04_rider/452.png differ diff --git a/svt/04_rider/65.png b/svt/04_rider/65.png new file mode 100644 index 0000000..bfb5c6a Binary files /dev/null and b/svt/04_rider/65.png differ diff --git a/svt/04_rider/99.png b/svt/04_rider/99.png new file mode 100644 index 0000000..9b9a080 Binary files /dev/null and b/svt/04_rider/99.png differ diff --git a/svt/05_caster/113.png b/svt/05_caster/113.png new file mode 100644 index 0000000..9fc2e6e Binary files /dev/null and b/svt/05_caster/113.png differ diff --git a/svt/05_caster/127.png b/svt/05_caster/127.png new file mode 100644 index 0000000..cc838ba Binary files /dev/null and b/svt/05_caster/127.png differ diff --git a/svt/05_caster/136.png b/svt/05_caster/136.png new file mode 100644 index 0000000..1d30e97 Binary files /dev/null and b/svt/05_caster/136.png differ diff --git a/svt/05_caster/150.png b/svt/05_caster/150.png new file mode 100644 index 0000000..904a012 Binary files /dev/null and b/svt/05_caster/150.png differ diff --git a/svt/05_caster/169.png b/svt/05_caster/169.png new file mode 100644 index 0000000..d4da62b Binary files /dev/null and b/svt/05_caster/169.png differ diff --git a/svt/05_caster/175.png b/svt/05_caster/175.png new file mode 100644 index 0000000..0682f84 Binary files /dev/null and b/svt/05_caster/175.png differ diff --git a/svt/05_caster/201.png b/svt/05_caster/201.png new file mode 100644 index 0000000..100afb3 Binary files /dev/null and b/svt/05_caster/201.png differ diff --git a/svt/05_caster/215.png b/svt/05_caster/215.png new file mode 100644 index 0000000..b39f7d7 Binary files /dev/null and b/svt/05_caster/215.png differ diff --git a/svt/05_caster/237.png b/svt/05_caster/237.png new file mode 100644 index 0000000..ffcca0d Binary files /dev/null and b/svt/05_caster/237.png differ diff --git a/svt/05_caster/284.png b/svt/05_caster/284.png new file mode 100644 index 0000000..c8e65b4 Binary files /dev/null and b/svt/05_caster/284.png differ diff --git a/svt/05_caster/307.png b/svt/05_caster/307.png new file mode 100644 index 0000000..d255709 Binary files /dev/null and b/svt/05_caster/307.png differ diff --git a/svt/05_caster/327.png b/svt/05_caster/327.png new file mode 100644 index 0000000..92acf59 Binary files /dev/null and b/svt/05_caster/327.png differ diff --git a/svt/05_caster/37.png b/svt/05_caster/37.png new file mode 100644 index 0000000..924d900 Binary files /dev/null and b/svt/05_caster/37.png differ diff --git a/svt/05_caster/385.png b/svt/05_caster/385.png new file mode 100644 index 0000000..cff5a6f Binary files /dev/null and b/svt/05_caster/385.png differ diff --git a/svt/05_caster/415.png b/svt/05_caster/415.png new file mode 100644 index 0000000..fbbbdf0 Binary files /dev/null and b/svt/05_caster/415.png differ diff --git a/svt/05_caster/435.png b/svt/05_caster/435.png new file mode 100644 index 0000000..fe15882 Binary files /dev/null and b/svt/05_caster/435.png differ diff --git a/svt/05_caster/462.png b/svt/05_caster/462.png new file mode 100644 index 0000000..20d5de3 Binary files /dev/null and b/svt/05_caster/462.png differ diff --git a/svt/05_caster/62.png b/svt/05_caster/62.png new file mode 100644 index 0000000..427a205 Binary files /dev/null and b/svt/05_caster/62.png differ diff --git a/svt/06_assassin/112.png b/svt/06_assassin/112.png new file mode 100644 index 0000000..09ff553 Binary files /dev/null and b/svt/06_assassin/112.png differ diff --git a/svt/06_assassin/139.png b/svt/06_assassin/139.png new file mode 100644 index 0000000..462b6ed Binary files /dev/null and b/svt/06_assassin/139.png differ diff --git a/svt/06_assassin/154.png b/svt/06_assassin/154.png new file mode 100644 index 0000000..be4ad3a Binary files /dev/null and b/svt/06_assassin/154.png differ diff --git a/svt/06_assassin/189.png b/svt/06_assassin/189.png new file mode 100644 index 0000000..3fb1484 Binary files /dev/null and b/svt/06_assassin/189.png differ diff --git a/svt/06_assassin/199.png b/svt/06_assassin/199.png new file mode 100644 index 0000000..00d742a Binary files /dev/null and b/svt/06_assassin/199.png differ diff --git a/svt/06_assassin/235.png b/svt/06_assassin/235.png new file mode 100644 index 0000000..00a9326 Binary files /dev/null and b/svt/06_assassin/235.png differ diff --git a/svt/06_assassin/239.png b/svt/06_assassin/239.png new file mode 100644 index 0000000..921d673 Binary files /dev/null and b/svt/06_assassin/239.png differ diff --git a/svt/06_assassin/314.png b/svt/06_assassin/314.png new file mode 100644 index 0000000..920ceff Binary files /dev/null and b/svt/06_assassin/314.png differ diff --git a/svt/06_assassin/365.png b/svt/06_assassin/365.png new file mode 100644 index 0000000..7dc65f6 Binary files /dev/null and b/svt/06_assassin/365.png differ diff --git a/svt/06_assassin/371.png b/svt/06_assassin/371.png new file mode 100644 index 0000000..ce7e679 Binary files /dev/null and b/svt/06_assassin/371.png differ diff --git a/svt/06_assassin/380.png b/svt/06_assassin/380.png new file mode 100644 index 0000000..b7c9425 Binary files /dev/null and b/svt/06_assassin/380.png differ diff --git a/svt/06_assassin/453.png b/svt/06_assassin/453.png new file mode 100644 index 0000000..8b67818 Binary files /dev/null and b/svt/06_assassin/453.png differ diff --git a/svt/06_assassin/75.png b/svt/06_assassin/75.png new file mode 100644 index 0000000..0679b47 Binary files /dev/null and b/svt/06_assassin/75.png differ diff --git a/svt/06_assassin/86.png b/svt/06_assassin/86.png new file mode 100644 index 0000000..aeccb47 Binary files /dev/null and b/svt/06_assassin/86.png differ diff --git a/svt/07_berserker/114.png b/svt/07_berserker/114.png new file mode 100644 index 0000000..cd650fa Binary files /dev/null and b/svt/07_berserker/114.png differ diff --git a/svt/07_berserker/155.png b/svt/07_berserker/155.png new file mode 100644 index 0000000..9a9b04b Binary files /dev/null and b/svt/07_berserker/155.png differ diff --git a/svt/07_berserker/161.png b/svt/07_berserker/161.png new file mode 100644 index 0000000..63c4a26 Binary files /dev/null and b/svt/07_berserker/161.png differ diff --git a/svt/07_berserker/226.png b/svt/07_berserker/226.png new file mode 100644 index 0000000..397be89 Binary files /dev/null and b/svt/07_berserker/226.png differ diff --git a/svt/07_berserker/247.png b/svt/07_berserker/247.png new file mode 100644 index 0000000..e69cb2f Binary files /dev/null and b/svt/07_berserker/247.png differ diff --git a/svt/07_berserker/261.png b/svt/07_berserker/261.png new file mode 100644 index 0000000..33e1680 Binary files /dev/null and b/svt/07_berserker/261.png differ diff --git a/svt/07_berserker/306.png b/svt/07_berserker/306.png new file mode 100644 index 0000000..08be0f3 Binary files /dev/null and b/svt/07_berserker/306.png differ diff --git a/svt/07_berserker/309.png b/svt/07_berserker/309.png new file mode 100644 index 0000000..9d7b8cf Binary files /dev/null and b/svt/07_berserker/309.png differ diff --git a/svt/07_berserker/355.png b/svt/07_berserker/355.png new file mode 100644 index 0000000..6b29042 Binary files /dev/null and b/svt/07_berserker/355.png differ diff --git a/svt/07_berserker/362.png b/svt/07_berserker/362.png new file mode 100644 index 0000000..cf2d14e Binary files /dev/null and b/svt/07_berserker/362.png differ diff --git a/svt/07_berserker/386.png b/svt/07_berserker/386.png new file mode 100644 index 0000000..01727b5 Binary files /dev/null and b/svt/07_berserker/386.png differ diff --git a/svt/07_berserker/429.png b/svt/07_berserker/429.png new file mode 100644 index 0000000..c7cc8fe Binary files /dev/null and b/svt/07_berserker/429.png differ diff --git a/svt/07_berserker/440.png b/svt/07_berserker/440.png new file mode 100644 index 0000000..24a8279 Binary files /dev/null and b/svt/07_berserker/440.png differ diff --git a/svt/07_berserker/51.png b/svt/07_berserker/51.png new file mode 100644 index 0000000..816bff6 Binary files /dev/null and b/svt/07_berserker/51.png differ diff --git a/svt/07_berserker/52.png b/svt/07_berserker/52.png new file mode 100644 index 0000000..25e448a Binary files /dev/null and b/svt/07_berserker/52.png differ diff --git a/svt/07_berserker/97.png b/svt/07_berserker/97.png new file mode 100644 index 0000000..679e403 Binary files /dev/null and b/svt/07_berserker/97.png differ diff --git a/svt/07_berserker/98.png b/svt/07_berserker/98.png new file mode 100644 index 0000000..e942f07 Binary files /dev/null and b/svt/07_berserker/98.png differ diff --git a/svt/08_ruler/173.png b/svt/08_ruler/173.png new file mode 100644 index 0000000..8bcbab8 Binary files /dev/null and b/svt/08_ruler/173.png differ diff --git a/svt/08_ruler/229.png b/svt/08_ruler/229.png new file mode 100644 index 0000000..671836b Binary files /dev/null and b/svt/08_ruler/229.png differ diff --git a/svt/08_ruler/265.png b/svt/08_ruler/265.png new file mode 100644 index 0000000..e62768d Binary files /dev/null and b/svt/08_ruler/265.png differ diff --git a/svt/08_ruler/292.png b/svt/08_ruler/292.png new file mode 100644 index 0000000..15b863f Binary files /dev/null and b/svt/08_ruler/292.png differ diff --git a/svt/08_ruler/305.png b/svt/08_ruler/305.png new file mode 100644 index 0000000..5f5a0f1 Binary files /dev/null and b/svt/08_ruler/305.png differ diff --git a/svt/08_ruler/346.png b/svt/08_ruler/346.png new file mode 100644 index 0000000..c12585b Binary files /dev/null and b/svt/08_ruler/346.png differ diff --git a/svt/08_ruler/357.png b/svt/08_ruler/357.png new file mode 100644 index 0000000..164ab21 Binary files /dev/null and b/svt/08_ruler/357.png differ diff --git a/svt/08_ruler/374.png b/svt/08_ruler/374.png new file mode 100644 index 0000000..5bf011e Binary files /dev/null and b/svt/08_ruler/374.png differ diff --git a/svt/08_ruler/390.png b/svt/08_ruler/390.png new file mode 100644 index 0000000..e61f016 Binary files /dev/null and b/svt/08_ruler/390.png differ diff --git a/svt/08_ruler/400.png b/svt/08_ruler/400.png new file mode 100644 index 0000000..bbee991 Binary files /dev/null and b/svt/08_ruler/400.png differ diff --git a/svt/08_ruler/438.png b/svt/08_ruler/438.png new file mode 100644 index 0000000..2649fad Binary files /dev/null and b/svt/08_ruler/438.png differ diff --git a/svt/08_ruler/59.png b/svt/08_ruler/59.png new file mode 100644 index 0000000..27892a2 Binary files /dev/null and b/svt/08_ruler/59.png differ diff --git a/svt/08_ruler/93.png b/svt/08_ruler/93.png new file mode 100644 index 0000000..79883dd Binary files /dev/null and b/svt/08_ruler/93.png differ diff --git a/svt/09_avenger/106.png b/svt/09_avenger/106.png new file mode 100644 index 0000000..ba74b04 Binary files /dev/null and b/svt/09_avenger/106.png differ diff --git a/svt/09_avenger/250.png b/svt/09_avenger/250.png new file mode 100644 index 0000000..29142c5 Binary files /dev/null and b/svt/09_avenger/250.png differ diff --git a/svt/09_avenger/268.png b/svt/09_avenger/268.png new file mode 100644 index 0000000..664df95 Binary files /dev/null and b/svt/09_avenger/268.png differ diff --git a/svt/09_avenger/303.png b/svt/09_avenger/303.png new file mode 100644 index 0000000..5e3ce62 Binary files /dev/null and b/svt/09_avenger/303.png differ diff --git a/svt/09_avenger/321.png b/svt/09_avenger/321.png new file mode 100644 index 0000000..9e1bb61 Binary files /dev/null and b/svt/09_avenger/321.png differ diff --git a/svt/09_avenger/370.png b/svt/09_avenger/370.png new file mode 100644 index 0000000..4d6da2a Binary files /dev/null and b/svt/09_avenger/370.png differ diff --git a/svt/09_avenger/403.png b/svt/09_avenger/403.png new file mode 100644 index 0000000..d95c409 Binary files /dev/null and b/svt/09_avenger/403.png differ diff --git a/svt/09_avenger/407.png b/svt/09_avenger/407.png new file mode 100644 index 0000000..3e25071 Binary files /dev/null and b/svt/09_avenger/407.png differ diff --git a/svt/09_avenger/409.png b/svt/09_avenger/409.png new file mode 100644 index 0000000..69880fa Binary files /dev/null and b/svt/09_avenger/409.png differ diff --git a/svt/09_avenger/96.png b/svt/09_avenger/96.png new file mode 100644 index 0000000..acb7f9a Binary files /dev/null and b/svt/09_avenger/96.png differ diff --git a/svt/10_alterego/163.png b/svt/10_alterego/163.png new file mode 100644 index 0000000..dcac281 Binary files /dev/null and b/svt/10_alterego/163.png differ diff --git a/svt/10_alterego/167.png b/svt/10_alterego/167.png new file mode 100644 index 0000000..044d3d5 Binary files /dev/null and b/svt/10_alterego/167.png differ diff --git a/svt/10_alterego/209.png b/svt/10_alterego/209.png new file mode 100644 index 0000000..34dfc05 Binary files /dev/null and b/svt/10_alterego/209.png differ diff --git a/svt/10_alterego/224.png b/svt/10_alterego/224.png new file mode 100644 index 0000000..4558291 Binary files /dev/null and b/svt/10_alterego/224.png differ diff --git a/svt/10_alterego/238.png b/svt/10_alterego/238.png new file mode 100644 index 0000000..c274497 Binary files /dev/null and b/svt/10_alterego/238.png differ diff --git a/svt/10_alterego/297.png b/svt/10_alterego/297.png new file mode 100644 index 0000000..cce8259 Binary files /dev/null and b/svt/10_alterego/297.png differ diff --git a/svt/10_alterego/336.png b/svt/10_alterego/336.png new file mode 100644 index 0000000..649ad53 Binary files /dev/null and b/svt/10_alterego/336.png differ diff --git a/svt/10_alterego/339.png b/svt/10_alterego/339.png new file mode 100644 index 0000000..165eba5 Binary files /dev/null and b/svt/10_alterego/339.png differ diff --git a/svt/10_alterego/369.png b/svt/10_alterego/369.png new file mode 100644 index 0000000..0899c7d Binary files /dev/null and b/svt/10_alterego/369.png differ diff --git a/svt/10_alterego/376.png b/svt/10_alterego/376.png new file mode 100644 index 0000000..59d0d6c Binary files /dev/null and b/svt/10_alterego/376.png differ diff --git a/svt/10_alterego/416.png b/svt/10_alterego/416.png new file mode 100644 index 0000000..3c3b18e Binary files /dev/null and b/svt/10_alterego/416.png differ diff --git a/svt/10_alterego/426.png b/svt/10_alterego/426.png new file mode 100644 index 0000000..4123643 Binary files /dev/null and b/svt/10_alterego/426.png differ diff --git a/svt/11_foreigner/195.png b/svt/11_foreigner/195.png new file mode 100644 index 0000000..ab32f91 Binary files /dev/null and b/svt/11_foreigner/195.png differ diff --git a/svt/11_foreigner/198.png b/svt/11_foreigner/198.png new file mode 100644 index 0000000..c78bb54 Binary files /dev/null and b/svt/11_foreigner/198.png differ diff --git a/svt/11_foreigner/275.png b/svt/11_foreigner/275.png new file mode 100644 index 0000000..2fbd7a0 Binary files /dev/null and b/svt/11_foreigner/275.png differ diff --git a/svt/11_foreigner/281.png b/svt/11_foreigner/281.png new file mode 100644 index 0000000..6654371 Binary files /dev/null and b/svt/11_foreigner/281.png differ diff --git a/svt/11_foreigner/289.png b/svt/11_foreigner/289.png new file mode 100644 index 0000000..206de12 Binary files /dev/null and b/svt/11_foreigner/289.png differ diff --git a/svt/11_foreigner/295.png b/svt/11_foreigner/295.png new file mode 100644 index 0000000..7a7c480 Binary files /dev/null and b/svt/11_foreigner/295.png differ diff --git a/svt/11_foreigner/324.png b/svt/11_foreigner/324.png new file mode 100644 index 0000000..7560318 Binary files /dev/null and b/svt/11_foreigner/324.png differ diff --git a/svt/11_foreigner/334.png b/svt/11_foreigner/334.png new file mode 100644 index 0000000..4f7efba Binary files /dev/null and b/svt/11_foreigner/334.png differ diff --git a/svt/11_foreigner/373.png b/svt/11_foreigner/373.png new file mode 100644 index 0000000..901b5c5 Binary files /dev/null and b/svt/11_foreigner/373.png differ diff --git a/svt/11_foreigner/393.png b/svt/11_foreigner/393.png new file mode 100644 index 0000000..787ce04 Binary files /dev/null and b/svt/11_foreigner/393.png differ diff --git a/svt/11_foreigner/413.png b/svt/11_foreigner/413.png new file mode 100644 index 0000000..b08a26d Binary files /dev/null and b/svt/11_foreigner/413.png differ diff --git a/svt/12_mooncancer/220.png b/svt/12_mooncancer/220.png new file mode 100644 index 0000000..9d4d991 Binary files /dev/null and b/svt/12_mooncancer/220.png differ diff --git a/svt/12_mooncancer/244.png b/svt/12_mooncancer/244.png new file mode 100644 index 0000000..9f281c3 Binary files /dev/null and b/svt/12_mooncancer/244.png differ diff --git a/svt/12_mooncancer/285.png b/svt/12_mooncancer/285.png new file mode 100644 index 0000000..8280d4c Binary files /dev/null and b/svt/12_mooncancer/285.png differ diff --git a/svt/12_mooncancer/351.png b/svt/12_mooncancer/351.png new file mode 100644 index 0000000..c9d81e2 Binary files /dev/null and b/svt/12_mooncancer/351.png differ diff --git a/svt/12_mooncancer/418.png b/svt/12_mooncancer/418.png new file mode 100644 index 0000000..a3426c3 Binary files /dev/null and b/svt/12_mooncancer/418.png differ diff --git a/svt/12_mooncancer/421.png b/svt/12_mooncancer/421.png new file mode 100644 index 0000000..dc8adb3 Binary files /dev/null and b/svt/12_mooncancer/421.png differ diff --git a/svt/12_mooncancer/448.png b/svt/12_mooncancer/448.png new file mode 100644 index 0000000..50b81c4 Binary files /dev/null and b/svt/12_mooncancer/448.png differ diff --git a/svt/13_pretender/316.png b/svt/13_pretender/316.png new file mode 100644 index 0000000..251bdc4 Binary files /dev/null and b/svt/13_pretender/316.png differ diff --git a/svt/13_pretender/353.png b/svt/13_pretender/353.png new file mode 100644 index 0000000..4106ffd Binary files /dev/null and b/svt/13_pretender/353.png differ diff --git a/svt/13_pretender/431.png b/svt/13_pretender/431.png new file mode 100644 index 0000000..5147f3a Binary files /dev/null and b/svt/13_pretender/431.png differ diff --git a/svt/13_pretender/437.png b/svt/13_pretender/437.png new file mode 100644 index 0000000..522863f Binary files /dev/null and b/svt/13_pretender/437.png differ diff --git a/svt/13_pretender/441.png b/svt/13_pretender/441.png new file mode 100644 index 0000000..23ef8ce Binary files /dev/null and b/svt/13_pretender/441.png differ diff --git a/svt/13_pretender/459.png b/svt/13_pretender/459.png new file mode 100644 index 0000000..f0112de Binary files /dev/null and b/svt/13_pretender/459.png differ diff --git a/svt/14_beast/377.png b/svt/14_beast/377.png new file mode 100644 index 0000000..513ae35 Binary files /dev/null and b/svt/14_beast/377.png differ diff --git a/svt/14_beast/417.png b/svt/14_beast/417.png new file mode 100644 index 0000000..a25d178 Binary files /dev/null and b/svt/14_beast/417.png differ diff --git a/svt/15_unbeast/444.png b/svt/15_unbeast/444.png new file mode 100644 index 0000000..7287cb1 Binary files /dev/null and b/svt/15_unbeast/444.png differ diff --git a/units.js b/units.js deleted file mode 100644 index a31f61e..0000000 --- a/units.js +++ /dev/null @@ -1,493 +0,0 @@ - var canvas, context; - var CELL_SIZE = 50; - var caculateField = 70; - var row_padding = 30; - var col_padding = 20; - var marginTop = 10; - var marginLeft = 10; - var country = "tw"; - var mode = 0; - var luckyBag = 0; - var CategoryNum; - var bgcolor = "rgb(176, 176, 176)"; - var mask = "rgb(0, 0, 0, 0.6)"; - var font_color = "rgb(0, 0, 0)"; - var unitMissing = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsSAAALEgHS3X78AAAOoElEQVRoga2Ze3Bc1X3Hv79z7q5W+5B2Jetly9hjC9kWRpIhdkxSJ5kBbB4DBZt4kpnMpKT2TJqUMCbG/JshnbSDH5iM0zSUtCnMNHFiaIgdgmWGmqlNYlpobYpxHTCW/JSNtLvax93de8759Y9772ol7epBODNn9t5z7z3n9znf3++8FphFEoAAgI5gcN6acHgFAEhAzubbuSRJJAFgbWNjz/xAoKWy7T85CUCAiKKAta+p6eDRJUuSa4CbQAQJWJ9KIwAsIgtC4At1dSvf6u5O7U0kDkYACSL6k2EkkQARNUoZfLa+/uCFvj6+tHo1v5pIXP0c0PtpwfgQd8+fv+q/Fiy4dvWWW/jcypW807J+HQMCs4Gp6R5SCKGZTSIUCv1DPP7S+gUL7o22tqpYXx/HcrlYd6Gw8T9te+BjoisSsBgwnwhCCEsxq/uXLbt1d3394dZgsCXW1aUj0ajpBHpax8Zu/oPWB4pERgCCAZ41iBRCaGPMvMbG8IEHHnj5iw0Nd4lSSUV27LDk178uQsPDunF4OLbEcTa9bdsDyU8IY0lpKWPUxjVr1vx46dLD4evXmyPLl+vAd74j5dKlIvT++6qzrq6nLZ3unQlmCoglpdDGmL7e3ugb+/cfWhmJ3J47dkxFnnjCkrfeCh4ehli7VgQzGd0xPBxb6jibTtr2wMgcYSwpLaW1+vLtt9/2wubNr/Lx44lgZ6eu27pVwraBUAhi6VJRf/as0xkK3dSSTvedmAZmAogkciGWLQsf/sUvDs1vaflS8vvfV5GtW63A6tXg69cBY8D5PMQtt4hANqtbr1+P9TnOpo9s+8iFWcJYlmUprdW2LVvWPfeDH7ySe/75Rmit67dskSgWwYUCOJ8HhcMQixfL0AcfOAvD4Z7WdLr/hNa/KgJTYMogkkhoZrOyqyv08le/+nKHUrePPvmkimzebAU++1nwtWsAM+A4YMcBcjmI3l4RzOV0w+horNtxNp1zYS5PB+MrsXnDhi8+t3//bzNPPx1T772nw1u3SrZtcKEAKOW2k8sB9fUQnZ0ydO6c0xmJ9LSk0/0njJkCIwFAAGQAbotGg//S0fFvC5LJDfk33nAh1qyBGR4GM4NLJRfCz7kcqKdH1OVyumFsLLrMcTaes+3XasFYQljKGLVp7dp1+1944bfZffuihcOHTeQb35Amn3eVUMptp1QCKwWTy4FCIVBHhwwNDanOaHRFazq96oQxB4qAJoBcIQBigGNEwb+R8sVbwuF7rXxeRR9+2Ar098P4SpRKbnac8i+XSkA+D7FsmQhmszqWzcaWOc7Gam5mEbmj04oVn/vXRx55xd6/P2YfPWoiX/uaMLYN2LarhNcO+/Ur5SoTDIJaWkTo0iVnYUPDitZUqv+EMQdKHowEQAEA3wsGn7+nq2tTLBh0Ig8/HLCWL4fxYqKy4vJvBQzn8xBdXaIuk9GxQiF2Y6n04Ee2PXDRg5FEQjGruzo6Vj+7evXv1IkTcWdw0EQeekgY2wbb9gQlTEUb5TbzeXAwCNHUJENXrjid8fiKeanUkmPGvKQBIgBoAiJHV648215XN79u82ZjdXUJzmQAIVwQLzOze+3/VpYZAwSDUEeP6pEzZ+S7Fy8O/10yuf4tolMgwp2JxKo9zc0D8VBonhUO6/Bdd0l2HLBSrt8ZA55Ut39dbkNrQEqYTMaYU6fEVce5/KUzZ7qTQE4SIGyiUrsQ4s8CgfVOT4+R9fXEtk1+75sqaphqKuXzQGenCOZyOqZUbHmp9NC7hcLLN91wQ8vf1tUdbZRyXl08ruvWrZNs2zDF4oQ6UKGAqVSjok04DpcKBY5cvCieHx198hXbfoMAQQBAgGAi84+JxPavJBI7sxs36vDixYLzeWKvt2qq4PdahXIIBKDeecekzp8Xb+VyF+ZFIuhSamGkudkEPvMZAa3d3q1QmCvqm3LN7L4vBJfyeRM/fVq+lEw+/hdjY7vALAgwPog7vBOpnzY2PvZgIrE7c++9OrRwoeBcjkA0DlEJVQlRCWcMOBCAPnXKpNNpMlqj0bLY6u+fADG5rlowPoRj26bpj3+ULyWT27fkcrsVswVAceU8QoDRgPW7YvF4k+Ok+y9cuLsYixkRjZLJ5Vw3811tkuRlV6h0A9sGmpvJSiYRdBxYPT3CFArgSe5U+V2lCxsvflgpsDHsZLMmfO6c/Nno6GPbcrk9JcAiD6JCjPEbAVgaUDui0Ucfb2ram7/tNh1saxMoFKgclJNcq1qQlnvUGzBYqeouyp4p3jV7irFS8AYDVo5jEsmk3JlKbXsqn98rActUQEwBmQyzvaFh2+MNDXvyq1bpQEuLQKEwJWamHcl8w3yDK402Bqx1OchNsThRLa3BxrDR2jQJIXcXi9/dlc3uqQZRFWQyzGPx+He3RyK78suXa6upSaBUonLv1fJx/54ZBJTBykYWCvDdDI4z/h289YY7K7ABdJOU1u5S6fE96fSuWhDA9NtVIwHrzULhuJYyty6d3mBblibLIi4WafKQXL73/VopmEIBOpeDSiahRkbgfPwxdCoFncm4IFq7Sx8iGCIwERiAAVgz6yYprV2Os+PpGSBmAinD/L5YPGakzH8hk9mQl9JAiDKMKZVgfOMdB8a2ocbG4IyOQo2OQqVS0Pm8G9Sea7EQvsEuiJeN+5w1s0lIae1R6oln0umdM0HMBmQijGXZn8/n1+cBQ0TEjuPC2DZUJgMnmXQNz2Zdw41xe9nPzGDfeADGvx/P7DCbBiHkM0o98cOxsadmAzFbkDLMH4rF/6gTIr+uWNyQYYaxbVKpFNTYmNvrSrkGVbhJZY/7BpvqEFDMaBVCPK/1jqcymZ3WLCHmAgKvfevtYvHYQilHuorFewq2XR6VyoZXZmbXfaqUTy7TzAgD9Koxj3wvm92r3ZXzrCCAOZyA+LNnkQg/ymReX9zQkO2wrKg2hgkgf9SZ+BFP3VzzVNMYYElEHzHnfpTN/nuRCJIZerbGYQ6KSMDSRKqfue+v4/HX57e2JkQmwwxQNbcxc1CDAWKtWba1BbuBL1+y7SNXZthpfiIQH6LPhRhY3t7eGrhyxWhA+Ab7eVqDa5W5vU9WJmPmtbdHlzJvHLTt167OAWZGEAFYhkjdzNz37URiYEl7eysuXNAKkP5IVAlSVmQ2ZZgY+IqZkE7rxo6O2I3MG4ds+8hVoitiFjDTglRA9H47kRhY0tbWxkNDWhFJf/ic4j7VXadmeSUgA9CAQDKp4/Pnx250lTkyPAuYmiCVEN9KJAYWt7a2maEhrYkkKueEOUBUU6PadxoQ7MF0Mz84ZNsDM8FUBfEhVjLf/K1EYuCGlpZ27UEw0ZxdR0/3vEq5D2NSKR3v6Ih1AxtngpkCIisg/ioeH1jY2tquBge1mU6JGWBqKjWDkgYQJpnUjbOAmQDiK9HO3PvNePy1JS0tbaXBwXElqhisZ6nKbAJ+Sn2eMjqV0vH29tgiYNOpQmEgUwWmvIyvhHg0Hj+yvLm5tTA0pFkIOWWtX22im/S84oq9hggAVZsQ4SlQ5fvxZIwOLVokz6ZS155JpdZfJTopmC0DqDKIf/iwhLl3Szx+pLupqdUeGtIQovaoVsOgimfMAEJuJ6Mwrj7N+H2t58w6fMMN8mw6fe25VGr9OaKTxCwYMETu+am5Gej7y3h8oL2pqdUeHNQQQhLRbAx2Lyc9McymkUj+nPmbxGy+IsSzKWYt3T9sqFodM8F48aTDixbJ4bGxa/+UTK4/BZwkQEgAHAPEtkTicEtz85L84KBiIqvm6IQpPjz5PVaAiQLyReCxA1rvO838DojSvcDdeWbD7lkzzSquKtsBwESimEqphra2WLcQn3+zUPhJETAW4C4EKRLRanAQJXg+4G+CpumhKr3HBjAxInmAaPuLSj0tgAAB+KXWe7VliQeYd2eYtfdXGs0y1iYkDSBw4QLQ1qaK3uGGJEBowPxvNvtav2XdV29McwnQDIhZz9puZs1sokTy10LseEmpXWJ8P2EEYJ025jikzK0ENtiA8RacNO3QPClrQAcBKyXlR09ns/eljBktuxYBYox59DTRoT4p7w8Z01QJM4thlBVgIh7Ey0rt9CHKnevBvG/MMRYidxPzhsJkN5shK0AHADkm5fkfEt15SesP/Rj3RxIWgEwbM3IaONQrxH31HgzcF2tPgi6EDgPWISl3HKwCMRnmDPMxSJnv8ZTxXGxaZTwl5JiU5/cBd17S+kMBSH8ukRWNsADkGPPIGaKDNxPdX8fc5Hgw1RRhD6KByDosxOO/0XpXLYjJMP/HfIykzK1wYfR0MMZTIiPE+R8T3eFDGIzvveSkRnyY0TNCHFwJ/HmwAmZyTHijk3VSiO2/Mma3cXecNSEqkiHAOst8bIEQmQ7mu2spowEtPYifEN1xuQrEFJAKGGuMeeQDokP9RPdZU2FYA6YBkO8SPfbPzHv0pLPYmRK5hlv/zXy8nSi9CLg7PwnGeBBaiPM/Be68aMyHnuJTdsFVZ25f/rQHs4LovvqJbsZhQL5JtG0/8141R4hKGAas94A364HUYuCeoisE+TGRdSHuGBqHqKp4zSUIu/LLNPPIWaLfdBPdW888rwSoekC+TvToQeZn4EF4hs0p+zAGsE4Dv5dEo13APTagAoCVFuLDnwF3XjbmHLmBXfM8oiZIEKA4EEgA8xSzfR042Ul0VxSI/g/RvjeZ/z4CtIaAoAWEgkA44OZI0MsBN0e933BleRCI1AHhMBBpABpiQNt54KQA6hYBa1NE1w4RPZwy5sMEEAsATmGaHWLV03gG0AxYHUAjAy0BoNMBQk3AqhaiZe8xH7AAYwMjNpDJAyXfJXi8jloH5Oy/IwCuB2S92xGNAJqygO4nevAycGqE+e0o4AC4zMDoIJB1aqhStTH/mQSkBCwLCAogBHfiUhYQMkDJ89cJCwk5fZ3lpCtWP94qUsL9uzxYAmzhzdYKKABwlJv9xcacQD5R8itkTK2cJz3/NNP/AzCxaVBYl+dwAAAAAElFTkSuQmCC" - - var Category = [ - 'saber', // 劍 - 'archer', // 弓 - 'lancer', // 槍 - 'rider', // 騎 - 'caster', // 術 - 'assassin', // 殺 - 'berserker', // 狂 - 'ruler', // 秤 - 'avenger', // 仇 - 'alterego', // 丑 - 'foreigner', // 外 - 'mooncancer' // 月 - ]; - - var Marks = [ - 'hiclipart', - 'heart' - ]; - - var AllCategoryNUM = { - "tw": [9, 9, 7, 8, 10, 7, 7, 3, 2, 3, 2, 1], - "jp": [12, 11, 9, 12, 11, 9, 10, 5, 4, 5, 3, 2] - }; - - //右鍵選單取消,綁定功能 - document.oncontextmenu = function(){return false}; - - //角色物件 - var Unit = function(imageUrl){ - var self = this; - this.imageUrl = imageUrl; - this.npLv = 0; - this.mark = 0; - this.image = new Image(); - this.image.src = this.imageUrl; - }; - - var CategoryLen = Category.length; - var categoryImages = new Array(CategoryLen); - var markImages = new Array(Marks.length); - - //設定標誌 - - for(var i = 0 ; i < Marks.length ; ++ i){ - markImages[i] = new Image(); - markImages[i].src = "images-mini/mark/" + Marks[i] + ".png"; - } - - //設定職階圖 - - for(var i = 0 ; i < CategoryLen ; ++ i){ - categoryImages[i] = new Image(); - categoryImages[i].src = "images-mini/class/class_" + (i + 1) + ".png"; - } - - var units = []; - - //設定英靈圖 - for (i = 0; i < CategoryLen; i++) { - units[i] = []; - for (j = 0; j < AllCategoryNUM["jp"][i]; j++) { - units[i][j] = new Unit("images-mini/" + Category[i] + "/" + (j + 1) + ".jpg"); - } - } - - function init(state = 0){ - CategoryNUM = Array.from(AllCategoryNUM[country]); - - //設定英靈圖 - if(state != 2){ - for (i = 0; i < CategoryLen; i++) { - units[i] = []; - for (j = 0; j < CategoryNUM[i]; j++) { - units[i][j] = new Unit("images-mini/" + Category[i] + "/" + (j + 1) + ".jpg"); - } - } - } - - if(state == 2 && country == "tw"){ - luckyBag ? CategoryNUM[4] = 9 : CategoryNUM[4] = 10; - } - - canvas = document.getElementById('canvas'); - canvas.onclick = onCanvasClick; - - twButton = document.getElementById('tw-button'); - jpButton = document.getElementById('jp-button'); - setButton = document.getElementById('set-button'); - maskButton = document.getElementById('mask-button'); - luckyBagButton = document.getElementById('luckyBag-button'); - - twButton.onclick = function(){ - if (country != "tw"){ - country = "tw"; - twButton.classList.remove("btn--primary"); - twButton.classList.add('btn--checked'); - jpButton.classList.remove("btn--checked"); - jpButton.classList.add('btn--primary'); - init(1); - } - - }; - jpButton.onclick = function(){ - if (country != "jp"){ - country = "jp"; - jpButton.classList.remove("btn--primary"); - jpButton.classList.add('btn--checked'); - twButton.classList.remove("btn--checked"); - twButton.classList.add('btn--primary'); - init(1); - } - }; - setButton.onclick = function(){ - mode = 0; - setButton.classList.remove("btn--primary"); - setButton.classList.add('btn--checked'); - maskButton.classList.remove("btn--checked"); - maskButton.classList.add('btn--primary'); - }; - maskButton.onclick = function(){ - mode = 1; - maskButton.classList.remove("btn--primary"); - maskButton.classList.add('btn--checked'); - setButton.classList.remove("btn--checked"); - setButton.classList.add('btn--primary'); - }; - luckyBagButton.onclick = function(){ - luckyBag = !luckyBag; - if(luckyBag){ - luckyBagButton.classList.remove("btn--primary"); - luckyBagButton.classList.add('btn--checked'); - marginLeft += caculateField; - }else{ - luckyBagButton.classList.remove("btn--checked"); - luckyBagButton.classList.add('btn--primary'); - marginLeft -= caculateField; - } - init(2); - }; - - if(!state){ - canvas.addEventListener('mousedown', function rightClickHandler(e) { - if(e.button === 2) { - rightClick(e); - } - }); - } - - canvas.width = luckyBag ? (Math.max.apply(null,CategoryNUM) + 1) * (CELL_SIZE + col_padding) + caculateField : (Math.max.apply(null,CategoryNUM) + 1) * (CELL_SIZE + col_padding); - canvas.height = CategoryLen * (CELL_SIZE + row_padding) + marginTop; - - context = canvas.getContext('2d'); - context.font = "20px Microsoft JhengHei"; - context.textBaseline = 'top'; - - context.fillStyle = bgcolor; - luckyBag ? context.fillRect (0, 0, canvas.width + caculateField, canvas.height) : context.fillRect (0, 0, canvas.width, canvas.height); - //context.fillRect (0, 0, canvas.width, canvas.height); - - fillTotalText(); - - for(var category = 0; category < CategoryLen; category++){ - drawImage(0, category, categoryImages[category]) - } - - for (i = 0; i < CategoryLen; i++) { - for (j = 0; j < CategoryNUM[i]; j++) { - drawImage(j + 1, i, units[i][j].image); - if(!units[i][j].npLv){ - fillRect(j, i, mask); - }else{ - fillNPText(j, i, "寶" + units[i][j].npLv, font_color); - } - if(units[i][j].mark){ - drawImage(j + 1, i, markImages[units[i][j].mark - 1]); - } - } - } - - if(luckyBag){ - fillCaculate(); - } - - context.font = "20px Microsoft JhengHei"; - context.fillStyle = mask; - context.fillText("This image was made by mgneko.github.io", 190 + marginLeft, canvas.height - 25); - } - - function drawImage(x, y, image){ - if(image.complete){ - try{ - context.drawImage(image, - x * (CELL_SIZE + col_padding) + marginLeft, - y * (CELL_SIZE + row_padding) + marginTop, - CELL_SIZE, - CELL_SIZE); - draw_done = 1; - }catch(e){ - image.src = unitMissing; - context.drawImage(image, - x * (CELL_SIZE + col_padding) + marginLeft, - y * (CELL_SIZE + row_padding) + marginTop, - CELL_SIZE, - CELL_SIZE); - } - }else{ - setTimeout(function(){ - drawImage(x, y, image); - },1000); - } - } - - function fillCaculate(){ - context.font = "12px Microsoft JhengHei"; - var have = 0; - var haveFull = 0; - var like = 0; - var percent = 0; - var ex = 0; - - context.fillStyle = bgcolor; - context.fillRect(0, 0, caculateField + 10, canvas.height) - context.fillStyle = font_color; - - for(var category = 0; category < CategoryLen; category++){ - if (category <= 7){ - have = 0; - haveFull = 0; - like = 0; - } - for(var attribute = 0; attribute < CategoryNUM[category]; attribute++){ - if (units[category][attribute].npLv){ - have += 1; - if(units[category][attribute].npLv == 5){ - haveFull += 1; - } - } - if (units[category][attribute].mark == 2){ - like += 1; - } - } - - if (category <= 6){ - - percent = ((1 - (have / attribute)) * 100); - context.fillText("新:" + percent.toFixed(2) + "%", - marginLeft - caculateField, - marginTop + category * (CELL_SIZE + row_padding)); - - percent = (haveFull / units[category].length * 100); - context.fillText("盤:" + percent.toFixed(2) + "%", - marginLeft - caculateField, - marginTop + category * (CELL_SIZE + row_padding) + 20); - - percent = (like / units[category].length * 100); - context.fillText("婆:" + percent.toFixed(2) + "%", - marginLeft - caculateField, - marginTop + category * (CELL_SIZE + row_padding) + 40); - }else { - ex += units[category].length; - } - } - - percent = ((1 - (have / ex)) * 100); - context.fillText("新:" + percent.toFixed(2) + "%", - marginLeft - caculateField, - marginTop + 7 * (CELL_SIZE + row_padding)); - - percent = (haveFull / ex * 100); - context.fillText("盤:" + percent.toFixed(2) + "%", - marginLeft - caculateField, - marginTop + 7 * (CELL_SIZE + row_padding) + 20); - - percent = (like / ex * 100); - context.fillText("婆:" + percent.toFixed(2) + "%", - marginLeft - caculateField, - marginTop + 7 * (CELL_SIZE + row_padding) + 40); - - context.font = "20px Microsoft JhengHei"; - } - - function fillRect(x, y, color){ - context.fillStyle = color; - context.fillRect ((x + 1) * (CELL_SIZE + col_padding) + marginLeft, - y * (CELL_SIZE + row_padding) + marginTop, - CELL_SIZE, - CELL_SIZE); - } - - function fillTextMask(x, y, color){ - context.fillStyle = color; - context.fillRect(x * (CELL_SIZE + col_padding) + marginLeft, - (y + 1) * (CELL_SIZE + row_padding) - row_padding + marginTop, - CELL_SIZE, - row_padding); - } - - function fillNPText(x, y, msg, color){ - context.fillStyle = color; - context.fillText(msg, - (x + 1) * (CELL_SIZE + col_padding) + 8 + marginLeft, - (y + 1) * (CELL_SIZE + row_padding) + marginTop - row_padding + 5, - CELL_SIZE); - } - - function fillTotalText(){ - var totalHave = 0; - var totalNP = 0; - var total = 0; - context.fillStyle = bgcolor; - context.fillRect(canvas.width - 200, canvas.height - 110, 200, 80) - - for (i = 0; i < CategoryLen; i++) { - for (j = 0; j < CategoryNUM[i]; j++) { - totalNP += units[i][j].npLv; - if(units[i][j].npLv){ - totalHave += 1; - } - } - } - for (var i = 0; i < CategoryNUM.length; i++) { - total += CategoryNUM[i]; - }; - var percent =(totalHave/total) * 100; - - context.fillStyle = font_color; - context.fillText("英靈持有數:"+ totalHave + "/" + total, - canvas.width - 200, - canvas.height - 90); - context.fillText("英靈持有率:" + percent.toFixed(2) + "%", - canvas.width - 200, - canvas.height - 70); - context.fillText("總寶數:" + totalNP, - canvas.width - 200, - canvas.height - 50); - } - - function getCoordinates (event){ - var rect = event.target.getBoundingClientRect(); - var x = event.clientX - rect.left; - var y = event.clientY - rect.top; - return {'x':x, 'y':y}; - } - - function getCategory(y){ - return Math.floor((y - marginTop) / (CELL_SIZE + row_padding)); - } - - function getAttribute(x){ - return Math.floor((x - marginLeft) / (CELL_SIZE + col_padding)); - } - - function rightClick(event){ - - var rect = event.target.getBoundingClientRect(); - var point = getCoordinates(event); - var attribute = getAttribute(point.x); - var category = getCategory(point.y); - if(point.x - (attribute * (CELL_SIZE + col_padding) + marginLeft) < CELL_SIZE && - point.x - (attribute * (CELL_SIZE + col_padding) + marginLeft) > 0 && - point.y - (category * (CELL_SIZE + row_padding) + marginTop) < CELL_SIZE && - point.y - (category * (CELL_SIZE + row_padding) + marginTop) > 0 && - attribute != 0 && - attribute <= CategoryNUM[category]){ - switch(mode) { - case 0: - if(units[category][attribute - 1].npLv){ - units[category][attribute - 1].npLv -= 1; - fillTextMask(attribute, category, bgcolor); - if(!units[category][attribute - 1].npLv){ - fillRect(attribute - 1, category, mask); - units[category][attribute - 1].mark && drawImage(attribute , category, markImages[units[category][attribute - 1].mark - 1]); - } - else{ - fillNPText(attribute - 1, category, "寶" + units[category][attribute - 1].npLv, font_color); - } - } - else{ - units[category][attribute - 1].npLv = 5; - drawImage(attribute , category, units[category][attribute - 1].image); - units[category][attribute - 1].mark && drawImage(attribute , category, markImages[units[category][attribute - 1].mark - 1]); - fillTextMask(attribute, category, bgcolor); - fillNPText(attribute - 1, category, "寶" + units[category][attribute - 1].npLv, font_color); - } - fillTotalText(); - if(luckyBag){ - fillCaculate(); - } - break; - case 1: - drawImage(attribute , category, units[category][attribute - 1].image); - if(!units[category][attribute - 1].npLv){ - fillRect(attribute - 1, category, mask); - } - if(units[category][attribute - 1].mark > 0){ - units[category][attribute - 1].mark--; - } - else{ - units[category][attribute - 1].mark = Marks.length; - } - if(units[category][attribute - 1].mark){ - drawImage(attribute , category, markImages[units[category][attribute - 1].mark - 1]); - } - if(luckyBag){ - fillCaculate(); - } - break; - } - } - } - - function onCanvasClick(event){ - - var rect = event.target.getBoundingClientRect(); - var point = getCoordinates(event); - var attribute = getAttribute(point.x); - var category = getCategory(point.y); - - if(point.x - (attribute * (CELL_SIZE + col_padding) + marginLeft) < CELL_SIZE && - point.x - (attribute * (CELL_SIZE + col_padding) + marginLeft) > 0 && - point.y - (category * (CELL_SIZE + row_padding) + marginTop) < CELL_SIZE && - point.y - (category * (CELL_SIZE + row_padding) + marginTop) > 0 && - attribute != 0 && - attribute <= CategoryNUM[category]){ - switch(mode) { - case 0: - if(!units[category][attribute - 1].npLv){ - drawImage(attribute , category, units[category][attribute - 1].image); - units[category][attribute - 1].mark && drawImage(attribute , category, markImages[units[category][attribute - 1].mark - 1]); - } - - if(units[category][attribute - 1].npLv < 5){ - units[category][attribute - 1].npLv += 1; - fillTextMask(attribute, category, bgcolor); - fillNPText(attribute - 1, category, "寶" + units[category][attribute - 1].npLv, font_color); - } - else{ - units[category][attribute - 1].npLv = 0; - fillRect(attribute - 1, category, mask); - units[category][attribute - 1].mark && drawImage(attribute , category, markImages[units[category][attribute - 1].mark - 1]); - fillTextMask(attribute, category, bgcolor); - //fillText(attribute - 1, category, "寶" + units[category][attribute - 1].npLv, font_color); - } - fillTotalText(); - if(luckyBag){ - fillCaculate(); - } - break; - case 1: - drawImage(attribute , category, units[category][attribute - 1].image); - if(!units[category][attribute - 1].npLv){ - fillRect(attribute - 1, category, mask); - } - units[category][attribute - 1].mark++; - units[category][attribute - 1].mark = units[category][attribute - 1].mark % (Marks.length + 1); - if(units[category][attribute - 1].mark){ - drawImage(attribute , category, markImages[units[category][attribute - 1].mark - 1]); - } - if(luckyBag){ - fillCaculate(); - } - break; - } - } - } - - function openImage(){ - try{ - var image = new Image(); - var canvas = document.getElementById("canvas"); - image.src = canvas.toDataURL("image/png"); - window.open().document.write(''); - }catch(e){ - alert(e); - } - } diff --git a/webcrawler/data/0_3_servents.xlsx b/webcrawler/data/0_3_servents.xlsx new file mode 100644 index 0000000..cdc1a0c Binary files /dev/null and b/webcrawler/data/0_3_servents.xlsx differ diff --git a/webcrawler/data/4_servents.xlsx b/webcrawler/data/4_servents.xlsx new file mode 100644 index 0000000..7a775b1 Binary files /dev/null and b/webcrawler/data/4_servents.xlsx differ diff --git a/webcrawler/data/5_servents.xlsx b/webcrawler/data/5_servents.xlsx new file mode 100644 index 0000000..64854d3 Binary files /dev/null and b/webcrawler/data/5_servents.xlsx differ diff --git a/webcrawler/data/servents.xlsx b/webcrawler/data/servents.xlsx new file mode 100644 index 0000000..1c4d2fa Binary files /dev/null and b/webcrawler/data/servents.xlsx differ diff --git a/webcrawler/start.py b/webcrawler/start.py new file mode 100644 index 0000000..a7b4d3b --- /dev/null +++ b/webcrawler/start.py @@ -0,0 +1,76 @@ +import json +import math +import re # 引入 Regex 模組 +from web_crawl import get_lucky_bag_arr + +# 目標網址 (FGO 10週年福袋公告) +url = "https://news.fate-go.jp/2025/10th_luckybag/" + +CLASS_KEYS = [ + "saber", "archer", "lancer", "rider", "caster", "assassin", "berserker", + "ruler", "avenger", "alterego", "mooncancer", "foreigner", "pretender", "beast", "unbeast" +] + +def split_list_into_chunks(data, n): + k, m = divmod(len(data), n) + return [data[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)] + +def map_to_keys(data_list): + mapped_dict = {} + for idx, ids in enumerate(data_list): + if idx < len(CLASS_KEYS): + key = CLASS_KEYS[idx] + else: + key = f"extra_{idx}" + mapped_dict[key] = ids + return mapped_dict + +def generate_json(): + print("開始抓取網頁資料...") + svt_arr = get_lucky_bag_arr(url) + + total_bags = len(svt_arr) + class_count = len(CLASS_KEYS) + print(f"抓取完成,共有 {total_bags} 袋資料。") + + if total_bags == 0: + return + + estimated_groups = max(1, round(total_bags / class_count)) + print(f"自動判定為 {estimated_groups} 大組 (Group)。") + + chunks = split_list_into_chunks(svt_arr, estimated_groups) + + result_json = {} + for i, chunk_data in enumerate(chunks): + group_name = f"group_{i+1}" + result_json[group_name] = map_to_keys(chunk_data) + print(f" - {group_name}: 分配到 {len(chunk_data)} 袋") + + # --- 輸出邏輯修改 --- + + # 1. 先產生標準 JSON 字串 (會有多餘換行) + json_str = json.dumps(result_json, ensure_ascii=False, indent=2) + + # 2. 定義壓縮陣列的函式 + # 將 [ \n 1, \n 2 \n ] 轉為 [1, 2] + def compact_array(match): + content = match.group(0) + # 移除換行與所有空白 + content = re.sub(r'\s+', '', content) + # 補回逗號後的一個空格,符合一般閱讀習慣 [1, 2, 3] + content = content.replace(',', ', ') + return content + + # 3. 使用 Regex 尋找所有數字陣列並壓縮 + # Pattern 說明: 尋找以 [ 開頭,] 結尾,且內容只包含數字、逗號、空白的字串 + json_str = re.sub(r'\[[\d,\s]+\]', compact_array, json_str) + + output_filename = "luckybag_web.json" + with open(output_filename, "w", encoding="utf-8") as f: + f.write(json_str) + + print(f"\n成功輸出 JSON 檔案: {output_filename} (已壓縮陣列格式)") + +if __name__ == "__main__": + generate_json() \ No newline at end of file diff --git a/webcrawler/web_crawl.py b/webcrawler/web_crawl.py new file mode 100644 index 0000000..f24c7dc --- /dev/null +++ b/webcrawler/web_crawl.py @@ -0,0 +1,155 @@ +import requests +import pandas as pd +import re +import unicodedata +from bs4 import BeautifulSoup + +# 職階對照表 +CLASS_NAME_MAP = { + "セイバー": "Saber", "アーチャー": "Archer", "ランサー": "Lancer", + "ライダー": "Rider", "キャスター": "Caster", "アサシン": "Assassin", + "バーサーカー": "Berserker", "ルーラー": "Ruler", "アヴェンジャー": "Avenger", + "ムーンキャンサー": "Mooncancer", "アルターエゴ": "Alterego", + "フォーリナー": "Foreigner", "プリテンダー": "Pretender", + "ビースト": "Beast", "アンビースト": "Unbeast", "シールダー": "Shielder", +} + +# 特殊名稱修正表 +NAME_UPDATES = { + "巌窟王 エドモン・ダンテス": "巌窟王", + "ジェームズ・モリアーティ(新宿のアーチャー)": "ジェームズ・モリアーティ", + "魔王信長(織田信長)": "魔王信長", + "グレゴリー・ラスプーチン": "言峰綺礼", + "武田信玄(武田晴信)": "武田晴信", + "アルトリア・キャスター(バーサーカー)": "アルトリア・キャスター", + "救世主トネリコ(雨の魔女トネリコ)": "雨の魔女トネリコ", + "阿曇磯良(ひびき&千鍵)" : "ひびき&千鍵", + "カレン・C・オルテンシア(アムール〔カレン〕)": "アムール〔カレン〕" +} + +def normalize_text(text): + """標準化文字""" + if not text: + return "" + normalized = unicodedata.normalize('NFKC', text) + return normalized.strip() + +def process_servant_name(svt_name): + """清洗從者名稱""" + name = NAME_UPDATES.get(svt_name, svt_name) + name = normalize_text(name) + name = name.replace(":", ":") + return name + +def get_lucky_bag_svt_name(url): + """爬取網頁""" + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" + } + + try: + response = requests.get(url, headers=headers, timeout=15) + response.raise_for_status() + except requests.RequestException as e: + print(f"[Error] 無法抓取網頁: {e}") + return [] + + soup = BeautifulSoup(response.content, 'html.parser') + table_mixed = [] + + tables = soup.find_all("table", class_="trbgcolor") + + for table in tables: + servants = [] + current_class = "" + current_rarity = "" + rows = table.select("tr") + + for row in rows: + class_node = row.find("td", class_="bd_l_none") + name_node = row.find("span", class_="icon_right_txt") + star_node = row.find("td", class_="servant_star bg_star_lb") + + if class_node: + current_class = class_node.text.strip() + if star_node: + current_rarity = star_node.text.strip() + + if name_node and current_rarity == "★★★★★": + servants.append(f"{current_class}_{name_node.text.strip()}") + + if servants: + table_mixed.append(servants) + + return table_mixed + +def get_lucky_bag_arr(url, excel_path="./data/5_servents.xlsx"): + """主邏輯""" + try: + df = pd.read_excel(excel_path) + except FileNotFoundError: + print(f"[Error] 找不到 Excel 檔案: {excel_path}") + return [] + + # 1. 建立查找字典 + lookup_dict = {} + for _, row in df.iterrows(): + # 修正 Excel 中的特殊職階名稱 + c_name = row['className'] + if c_name == 'Unbeastolgamarie': + c_name = 'Unbeast' + + clean_jp_name = process_servant_name(row['name_JP']) + key = f"{c_name}{clean_jp_name}" + lookup_dict[key] = row['collectionNo'] + + # 2. 抓取資料 + raw_data = get_lucky_bag_svt_name(url) + table_collections = [] + + # 用來儲存錯誤訊息的列表 + missing_log = [] + + print(f"正在處理 {len(raw_data)} 組福袋資料...\n") + + for idx, group in enumerate(raw_data): + group_ids = [] + print(f"--- Group {idx + 1} ---") + + for entry in group: + try: + raw_class, raw_name = entry.split("_", 1) + except ValueError: + continue + + class_eng = CLASS_NAME_MAP.get(raw_class, raw_class) + name_jp = process_servant_name(raw_name) + key = f"{class_eng}{name_jp}" + + collection_no = lookup_dict.get(key) + + # Retry logic + if not collection_no: + name_no_brackets = re.sub(r'\(.*?\)', '', name_jp) + name_no_brackets = re.sub(r'(.*?)', '', name_no_brackets) + key_retry = f"{class_eng}{name_no_brackets}" + collection_no = lookup_dict.get(key_retry) + + if collection_no: + group_ids.append(collection_no) + else: + # [修改點] 記錄無法匹配的項目 + msg = f"[MISS] 無法匹配: {raw_name} (Class: {class_eng})\n 嘗試 Key: {key}" + print(f" {msg}") + missing_log.append(msg + "\n") + + if group_ids: + table_collections.append(group_ids) + + # [修改點] 將錯誤輸出成檔案 + if missing_log: + with open("missing_servants.txt", "w", encoding="utf-8") as f: + f.writelines(missing_log) + print(f"\n[Info] 已將 {len(missing_log)} 筆無法匹配的資料寫入 missing_servants.txt") + + return table_collections \ No newline at end of file