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