From 5e5cbda0d559cee28a4d808458582ec8d434bef5 Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Wed, 11 Feb 2026 10:12:35 +0800 Subject: [PATCH 1/7] Update install.js --- Electron/AMAI-release/install.js | 42 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/Electron/AMAI-release/install.js b/Electron/AMAI-release/install.js index 95bd469c7..b7aa1cb25 100644 --- a/Electron/AMAI-release/install.js +++ b/Electron/AMAI-release/install.js @@ -3,7 +3,8 @@ const path = require("path"); const { takeHeapSnapshot } = require("process"); const spawnSync = require("child_process").spawnSync; const arrayOfFiles = []; - +let totalFiles = 0; +let currentFileIndex = 0; /** uncomment to debbug */ // const ls = spawnSync( @@ -33,17 +34,15 @@ const installOnDirectory = async () => { const args = process.argv.slice(2); const response = args[0]; const commander = args[1]; - const ver = args[2] - const language = args[3] - const installCommander = commander == 1 - const vsAICommander = commander == 2 - let bj = 'Blizzard.j' - if (vsAICommander) { bj = 'vsai\\Blizzard.j'} - + const ver = args[2]; + const language = args[3]; + const installCommander = commander == 1; + const vsAICommander = commander == 2; + let bj = 'Blizzard.j'; + if (vsAICommander) {bj = 'vsai\\Blizzard.j'} const commonAIPath = `Scripts\\${ver}\\common.ai` const blizzardPath =`Scripts\\${ver}\\Blizzard.j` - - process.send(`#### Installing AMAI for ${ver} Commander ${commander > 0 ? bj : 'None'} forcing ai language to ${language || 'default'} ####`); + process.send(`#### Installing AMAI for ${ver} Commander ${installCommander ? 'install' : (vsAICommander ? 'install VS AI' : 'none')} , forcing ai language to ${args[3]} ####`); // TODO: change to receive array of maps if (fs.statSync(response).isDirectory()) { @@ -71,8 +70,6 @@ const installOnDirectory = async () => { return } - - if (language !== '-') { setLanguage(commonAIPath, language); if (installCommander) { @@ -85,8 +82,9 @@ const installOnDirectory = async () => { } } - if(arrayOfFiles) { + totalFiles = arrayOfFiles.length; + //process.send({ type: 'progress', current: currentFileIndex, total: totalFiles }); for (const file of arrayOfFiles) { /** uncomment to debbug */ // process.send(`path.extname(file): ${path.extname(file)}`); @@ -94,6 +92,15 @@ const installOnDirectory = async () => { const ext = path.extname(file).toLowerCase(); if(ext.indexOf(`w3m`) >= 0 || ext.indexOf(`w3x`) >= 0) { + currentFileIndex++; + // Send complete progress data including both current and total + if (process.send) { + process.send({ + type: 'progress', + current: currentFileIndex, + total: totalFiles, + }); + } process.send(`#### Installing ${ver} into file: ${file} ####`); } else { process.send(`skip file: ${file}`); @@ -128,7 +135,7 @@ const installOnDirectory = async () => { process.send(mpqEditor.error.message) : process.send(`Resize map hashtable size ${file}`); - const f1AddToMPQ = spawnSync( + const f1AddToMPQ = spawnSync( `MPQEditor.exe`, [ 'a', @@ -178,16 +185,15 @@ const installOnDirectory = async () => { f1AddVSAIToMPQ.error ? process.send(f1AddVSAIToMPQ.error.message) : process.send(`Installing VS Vanilla AI Scripts ${file}`); - } - const f2AddToMPQ = spawnSync( + const f2AddToMPQ = spawnSync( `MPQEditor.exe`, [ 'a', file, `Scripts\\${ver}\\${bj}`, - `Scripts\\Blizzard.j`, + `Scripts\\Blizzard.j` ], { encoding : `utf8` } ); @@ -206,7 +212,6 @@ const installOnDirectory = async () => { f2AddToMPQ.error ? process.send(f2AddToMPQ.error.message) : process.send(installCommander ? `Installing commander ${file}` : `Installing VS Vanilla AI commander ${file}`); - } const f3AddToMPQ = spawnSync( @@ -239,7 +244,6 @@ const installOnDirectory = async () => { } } - function setLanguage(file, language) { let data = fs.readFileSync(file, 'utf8'); const searchFor = /string language = "([^"]*)"/; From ddb2390c9f90f873a5d2d30c5fc20e4eb876c7bb Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Wed, 11 Feb 2026 10:16:44 +0800 Subject: [PATCH 2/7] Set minimum window size and enhance message handling Added minimum width and height for the browser window and improved message handling for installation progress updates. --- Electron/app/main.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Electron/app/main.ts b/Electron/app/main.ts index 6d045bc0f..42d34444c 100644 --- a/Electron/app/main.ts +++ b/Electron/app/main.ts @@ -25,13 +25,14 @@ const isDev = () => { const createWindow = (): BrowserWindow => { const size = screen.getPrimaryDisplay().workAreaSize; - // Create the browser window. win = new BrowserWindow({ x: 0, y: 0, width: size.width, height: size.height, + minWidth: 1280, + minHeight: 940, webPreferences: { devTools: true, nodeIntegration: true, @@ -156,10 +157,16 @@ const execInstall = async (signal, commander: number = 1, isMap: boolean = false } ); - // send messages to modal on front child.on('message', (message) => { - win.webContents.send('on-install-message', message); + if (typeof message === 'object' && message.type === 'progress') { + // Send progress updates via dedicated channel + console.log('progress:', message); + win.webContents.send('on-install-progress', message); + } else { + // Send regular messages via standard channel + win.webContents.send('on-install-message', message); + } }); // close modal on process finishes From e10f2f18dc4ea774f772dbb0cccff50ae2400e19 Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Wed, 11 Feb 2026 10:19:38 +0800 Subject: [PATCH 3/7] Add installation progress tracking to app component --- Electron/src/app/app.component.ts | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/Electron/src/app/app.component.ts b/Electron/src/app/app.component.ts index 289b43199..e070e6752 100644 --- a/Electron/src/app/app.component.ts +++ b/Electron/src/app/app.component.ts @@ -14,6 +14,9 @@ export class AppComponent implements AfterViewChecked { public active = false; public couldClose = false; public messages = []; + public currentFile = 0; + public totalFiles = 0; + public installingText = ''; @ViewChild('logareawrapper') private readonly logContainer: ElementRef; @@ -44,16 +47,29 @@ export class AppComponent implements AfterViewChecked { }) this.cdr.detectChanges(); }); - if (electronService.isElectron) { this.menuService.createMenu(); + this.electronService.ipcRenderer.on('on-install-progress', (_, args: { current: number, total: number }) => { + // console.log('totalFiles-in:', args.total, 'currentFile-in:', args.current); + if ( args.total > 0 && this.totalFiles < args.total) { + this.totalFiles = args.total; + } + if (this.currentFile < this.totalFiles) { + this.currentFile++; + this.title = '(' + this.currentFile + '/' + this.totalFiles + ') ' + this.installingText; + } + // console.log('totalFiles-out:', this.totalFiles, 'currentFile-out:', this.currentFile); + this.cdr.detectChanges(); + }); + // TODO: add 'push notification'/'notification' this.electronService.ipcRenderer.on('on-install-init', (_, args: InstallModel) => { console.log('args-install-init', args) this.translate.get(t_('PAGES.APP.INSTALLING'), {path: args.response}).subscribe((res: string) => { - this.title = res + this.title = '(0/X) ' + res; + this.installingText = res; }); this.active = true; this.couldClose = false; @@ -77,16 +93,19 @@ export class AppComponent implements AfterViewChecked { console.log('args-install-empty', args); this.active = false; this.couldClose = true; + this.totalFiles = 0; + this.currentFile = 0; this.cdr.detectChanges(); }); // TODO: add 'push notification'/'notification' this.electronService.ipcRenderer.on('on-install-exit', (_, args) => { this.translate.get(t_('PAGES.APP.INSTALL_DONE')).subscribe((res: string) => { - this.title = res; + this.title = '(' + this.currentFile + '/' + this.totalFiles + ')' + ' ' + res; }); this.couldClose = true; - + this.totalFiles = 0; + this.currentFile = 0; this .menuService .changeEnabledMenuState(true); @@ -104,7 +123,8 @@ export class AppComponent implements AfterViewChecked { this.electronService.ipcRenderer.on('on-install-error', (_, args) => { console.log('args-install-error', args); this.couldClose = true; - + this.totalFiles = 0; + this.currentFile = 0; this .menuService .changeEnabledMenuState(true); From a9663c7f3a5454bd15a89afe029d4599b911aec1 Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Sat, 14 Feb 2026 15:40:43 +0800 Subject: [PATCH 4/7] Update install.js --- Electron/AMAI-release/install.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Electron/AMAI-release/install.js b/Electron/AMAI-release/install.js index b7aa1cb25..3c9790a6a 100644 --- a/Electron/AMAI-release/install.js +++ b/Electron/AMAI-release/install.js @@ -42,7 +42,7 @@ const installOnDirectory = async () => { if (vsAICommander) {bj = 'vsai\\Blizzard.j'} const commonAIPath = `Scripts\\${ver}\\common.ai` const blizzardPath =`Scripts\\${ver}\\Blizzard.j` - process.send(`#### Installing AMAI for ${ver} Commander ${installCommander ? 'install' : (vsAICommander ? 'install VS AI' : 'none')} , forcing ai language to ${args[3]} ####`); + process.send(`#### Installing AMAI for ${ver} Commander ${commander > 0 ? bj : 'None'} forcing ai language to ${language || 'default'} ####`); // TODO: change to receive array of maps if (fs.statSync(response).isDirectory()) { From 5a5cad72915db24d506e276edf46c197505f6aea Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:46:23 +0800 Subject: [PATCH 5/7] Add files via upload --- Electron/src/assets/i18n/de.json | 4 +++- Electron/src/assets/i18n/en.json | 4 +++- Electron/src/assets/i18n/es.json | 4 +++- Electron/src/assets/i18n/fr.json | 4 +++- Electron/src/assets/i18n/no.json | 4 +++- Electron/src/assets/i18n/pt.json | 4 +++- Electron/src/assets/i18n/ro.json | 4 +++- Electron/src/assets/i18n/ru.json | 4 +++- Electron/src/assets/i18n/sv.json | 4 +++- Electron/src/assets/i18n/zh.json | 6 ++++-- 10 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Electron/src/assets/i18n/de.json b/Electron/src/assets/i18n/de.json index 173d3d31f..d34a6400c 100644 --- a/Electron/src/assets/i18n/de.json +++ b/Electron/src/assets/i18n/de.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Gegen Vanilla KI", "INCLUDE_COMMANDER_OFF": "Kein Kommandant", "OPTIMISE": "Optimierte Skripte verwenden", - "FORCELANG": "AI Chat Sprache überschreiben" + "FORCELANG": "AI Chat Sprache überschreiben", + "CAN_NOT_GET_DEFAULT_PATH":"Kann den Standardspeicherort nicht abrufen", + "DEFAULT_PATH":"Standardpfad: " }, "APP": { "INSTALLING": "Installation in {{path}}", diff --git a/Electron/src/assets/i18n/en.json b/Electron/src/assets/i18n/en.json index 2a176ceb0..c2b4ff105 100644 --- a/Electron/src/assets/i18n/en.json +++ b/Electron/src/assets/i18n/en.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Vs Vanilla AI", "INCLUDE_COMMANDER_OFF": "No Commander", "OPTIMISE": "Use Optimised Scripts", - "FORCELANG": "Override AI Chat Language" + "FORCELANG": "Override AI Chat Language", + "CAN_NOT_GET_DEFAULT_PATH":"Can not get default path", + "DEFAULT_PATH":"Default path: " }, "APP": { "INSTALLING": "Installing into {{path}}", diff --git a/Electron/src/assets/i18n/es.json b/Electron/src/assets/i18n/es.json index ffdf3bdc8..5948f236e 100644 --- a/Electron/src/assets/i18n/es.json +++ b/Electron/src/assets/i18n/es.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Contra IA Vanilla", "INCLUDE_COMMANDER_OFF": "Sin Comandante", "OPTIMISE": "Usar scripts optimizados", - "FORCELANG": "Cubrir el lenguaje de chat de Ia" + "FORCELANG": "Cubrir el lenguaje de chat de Ia", + "CAN_NOT_GET_DEFAULT_PATH":"No se puede obtener la ruta predeterminada", + "DEFAULT_PATH":"Ruta predeterminada: " }, "APP": { "INSTALLING": "Instalando en {{path}}", diff --git a/Electron/src/assets/i18n/fr.json b/Electron/src/assets/i18n/fr.json index 341b472f4..309bd5b57 100644 --- a/Electron/src/assets/i18n/fr.json +++ b/Electron/src/assets/i18n/fr.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Contre IA Vanilla", "INCLUDE_COMMANDER_OFF": "Pas de Commandant", "OPTIMISE": "Utiliser des scripts optimisés", - "FORCELANG": "Couvrir le langage de chat ai" + "FORCELANG": "Couvrir le langage de chat ai", + "CAN_NOT_GET_DEFAULT_PATH":"Ne peut pas obtenir le chemin par défaut", + "DEFAULT_PATH":"Chemin par défaut: " }, "APP": { "INSTALLING": "Installation dans {{path}}", diff --git a/Electron/src/assets/i18n/no.json b/Electron/src/assets/i18n/no.json index 370a2f190..e83d9c71a 100644 --- a/Electron/src/assets/i18n/no.json +++ b/Electron/src/assets/i18n/no.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Mot Vanilla AI", "INCLUDE_COMMANDER_OFF": "Ingen Kommandant", "OPTIMISE": "Bruk optimaliserte skript", - "FORCELANG": "Overskriv AI-samtalespråk" + "FORCELANG": "Overskriv AI-samtalespråk", + "CAN_NOT_GET_DEFAULT_PATH":"Kan ikke få standardstien", + "DEFAULT_PATH":"Standardstiendeveis: " }, "APP": { "INSTALLING": "Installerer i {{path}}", diff --git a/Electron/src/assets/i18n/pt.json b/Electron/src/assets/i18n/pt.json index acdbf0c2a..a5e85cfea 100644 --- a/Electron/src/assets/i18n/pt.json +++ b/Electron/src/assets/i18n/pt.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Contra IA Vanilla", "INCLUDE_COMMANDER_OFF": "Sem Comandante", "OPTIMISE": "Usar scripts otimizados", - "FORCELANG": "Substituir a linguagem de conversação AI" + "FORCELANG": "Substituir a linguagem de conversação AI", + "CAN_NOT_GET_DEFAULT_PATH":"Can not get caminho padrão", + "DEFAULT_PATH":"caminho padrão: " }, "APP": { "INSTALLING": "Instalando em {{path}}", diff --git a/Electron/src/assets/i18n/ro.json b/Electron/src/assets/i18n/ro.json index 0330126b4..272ca4dc2 100644 --- a/Electron/src/assets/i18n/ro.json +++ b/Electron/src/assets/i18n/ro.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Împotriva AI Vanilla", "INCLUDE_COMMANDER_OFF": "Fără comandant", "OPTIMISE": "Utilizați scripturi optimizate", - "FORCELANG": "Suprascrie limbajul de chat AI" + "FORCELANG": "Suprascrie limbajul de chat AI", + "CAN_NOT_GET_DEFAULT_PATH":"Nu se poate obține calea implicită", + "DEFAULT_PATH":"Căi implicită: " }, "APP": { "INSTALLING": "Instalare în curs la {{path}}", diff --git a/Electron/src/assets/i18n/ru.json b/Electron/src/assets/i18n/ru.json index 86b1c6cc3..e4fe6a06f 100644 --- a/Electron/src/assets/i18n/ru.json +++ b/Electron/src/assets/i18n/ru.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Против Vanilla ИИ", "INCLUDE_COMMANDER_OFF": "Без командира", "OPTIMISE": "Использовать оптимизированные скрипты", - "FORCELANG": "Скачать язык разговора" + "FORCELANG": "Скачать язык разговора", + "CAN_NOT_GET_DEFAULT_PATH":"Не удается получить путь по умолчанию", + "DEFAULT_PATH":"Nути по умолчанию: " }, "APP": { "INSTALLING": "Установка в {{path}}", diff --git a/Electron/src/assets/i18n/sv.json b/Electron/src/assets/i18n/sv.json index 084909b1e..843a4e772 100644 --- a/Electron/src/assets/i18n/sv.json +++ b/Electron/src/assets/i18n/sv.json @@ -10,7 +10,9 @@ "INCLUDE_COMMANDER_VSAI": "Mot Vanilla AI", "INCLUDE_COMMANDER_OFF": "Ingen befälhavare", "OPTIMISE": "Använd optimerade skript", - "FORCELANG": "Skriv över AI-chattspråk" + "FORCELANG": "Skriv över AI-chattspråk", + "CAN_NOT_GET_DEFAULT_PATH":"Kan inte få standardvägen", + "DEFAULT_PATH":"Standardväg: " }, "APP": { "INSTALLING": "Installerar i {{path}}", diff --git a/Electron/src/assets/i18n/zh.json b/Electron/src/assets/i18n/zh.json index 6107cf9fd..ee38b9edb 100644 --- a/Electron/src/assets/i18n/zh.json +++ b/Electron/src/assets/i18n/zh.json @@ -7,10 +7,12 @@ "INSTALL_ON_FOLDER": "按文件夹安装", "INSTALL_ON_MAP": "按地图安装", "INCLUDE_COMMANDER": "安装控制台", - "INCLUDE_COMMANDER_VSAI": "AMAI VS 暴雪AI", + "INCLUDE_COMMANDER_VSAI": "AMAI VS 暴雪AI 控制台", "INCLUDE_COMMANDER_OFF": "不安装控制台", "OPTIMISE": "使用优化脚本", - "FORCELANG": "覆盖AI聊天语言" + "FORCELANG": "覆盖AI聊天语言", + "CAN_NOT_GET_DEFAULT_PATH":"找不到默认路径", + "DEFAULT_PATH":"默认路径:" }, "APP": { "INSTALLING": "正在安装 {{path}}", From 5961992eedc5c11b847702112a28b8a84916c750 Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:49:10 +0800 Subject: [PATCH 6/7] Update main.ts --- Electron/app/main.ts | 100 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 9 deletions(-) diff --git a/Electron/app/main.ts b/Electron/app/main.ts index 42d34444c..6c945bccc 100644 --- a/Electron/app/main.ts +++ b/Electron/app/main.ts @@ -9,6 +9,7 @@ const cp = require('child_process'); let win: BrowserWindow = null; let translations : { [key: string]: string } = {}; let currentLanguage: string = "English"; +let defaultPath: string | null = null; const args = process.argv.slice(1), serve = args.some(val => val === '--serve'); @@ -77,16 +78,65 @@ const createWindow = (): BrowserWindow => { const execInstall = async (signal, commander: number = 1, isMap: boolean = false, ver: string = "REFORGED", forceLang: boolean) => { const controller = new AbortController(); - const response = dialog.showOpenDialogSync(win, { - // TODO: add i18n here - title : isMap ? translations["PAGES.ELECTRON.OPEN_MAP"] || '': translations["PAGES.ELECTRON.OPEN_DIR"] || '', - // TODO: Change to let multiples selections when is map - properties: isMap ? ['openFile'] : ['openDirectory'], - // TODO: add i18n here - filters: isMap ? [ + let response; + try { + const settingsPath = path.join(app.getPath('userData'), 'settings.json'); + if (fs.existsSync(settingsPath)) { + const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); + defaultPath = settings.defaultPath || null; + console.log('get default Path :',defaultPath); + } + } catch (err) { + console.error('Failed to load default path:', err); + } + // Handle folder mode (isMap = false) + if (!isMap) { + // If default path exists, use it directly + if (defaultPath) { + response = [defaultPath]; + } else { + // Show dialog and save selected path as default + response = dialog.showOpenDialogSync(win, { + title: translations["PAGES.ELECTRON.OPEN_DIR"] || '', + properties: ['openDirectory'], + }); + + // Save the selected path as default if not canceled + if (response && response.length > 0) { + defaultPath = response[0]; + console.log('set default Path :',defaultPath); + // Save to settings.json directly in main process + const settingsPath = path.join(app.getPath('userData'), 'settings.json'); + const settings = { + defaultPath: defaultPath + }; + fs.writeFileSync(settingsPath, JSON.stringify(settings)); + } + } + } else { + // Handle map mode (isMap = true) + const documentsPath = app.getPath('documents'); + response = dialog.showOpenDialogSync(win, { + title: translations["PAGES.ELECTRON.OPEN_MAP"] || '', + properties: ['openFile'], + filters: [ { name: translations["PAGES.ELECTRON.MAPFILE"] || '', extensions: ['w3x', 'w3m'] }, - ] : null, - }); + ], + // Use default path if available, otherwise open "documents" + defaultPath: defaultPath || documentsPath, + }); + // 选择文件后自动将文件所在目录设为默认路径 + if (response && response.length > 0) { + const filePath = response[0]; + const folderPath = path.dirname(filePath); + defaultPath = folderPath; + const settingsPath = path.join(app.getPath('userData'), 'settings.json'); + const settings = { defaultPath: folderPath }; + fs.writeFileSync(settingsPath, JSON.stringify(settings)); + console.log('Default path updated to:', folderPath); + } + console.log('default Path :',defaultPath); + } let child; @@ -178,6 +228,37 @@ const execInstall = async (signal, commander: number = 1, isMap: boolean = false } } + +const setupFileOperations = () => { + ipcMain?.handle('file-operations', async (_, { operation, payload }) => { + switch(operation) { + case 'load-default-path': + const settingsPath = path.join(app.getPath('userData'), 'settings.json'); + if (fs.existsSync(settingsPath)) { + return JSON.parse(fs.readFileSync(settingsPath, 'utf8')).defaultPath; + } + return null; + + case 'select-folder': + const result = dialog.showOpenDialogSync(win, { + title: translations["PAGES.ELECTRON.OPEN_DIR"] || '', + defaultPath: payload?.defaultPath, + properties: ['openDirectory'], + }); + return result && result.length > 0 ? result[0] : null; + + case 'save-default-path': { + const settingsPath = path.join(app.getPath('userData'), 'settings.json'); + fs.writeFileSync(settingsPath, JSON.stringify({ defaultPath: payload })); + return true; + } + + default: + throw new Error(`unknow: ${operation}`); + } + }); +} + const installProcess = () => { let signal = {}; @@ -274,4 +355,5 @@ const installTrans = () => { init(); installTrans(); +setupFileOperations(); installProcess(); From f93b9bb698f8b21b573a0c7ffed126d3f85bf255 Mon Sep 17 00:00:00 2001 From: jzy-chitong56 <48715223+jzy-chitong56@users.noreply.github.com> Date: Sat, 21 Feb 2026 20:02:41 +0800 Subject: [PATCH 7/7] Add files via upload --- Electron/src/app/home/home.component.html | 24 +- Electron/src/app/home/home.component.scss | 420 ++++++++++++---------- Electron/src/app/home/home.component.ts | 119 ++++-- 3 files changed, 341 insertions(+), 222 deletions(-) diff --git a/Electron/src/app/home/home.component.html b/Electron/src/app/home/home.component.html index 0711661b8..ff0419972 100644 --- a/Electron/src/app/home/home.component.html +++ b/Electron/src/app/home/home.component.html @@ -7,20 +7,20 @@
- 1.33+
- Optimal:2.0.4
+ 2.0.3+
+ {{ 'PAGES.HOME.REF_BEST_GAME_VERSION' | translate }}
- 1.24+
- Optimal:1.24-1.28
+ 1.24e+
+ {{ 'PAGES.HOME.TFT_BEST_GAME_VERSION' | translate }}
- 1.24 - 1.31
- Optimal:1.24-1.28
+ 1.24e+ ~ 1.31
+ {{ 'PAGES.HOME.ROC_BEST_GAME_VERSION' | translate }}