| 
 
				 (14.04.2023 01:42)XEPOMAHT Wrote:   (14.04.2023 00:16)Elmore Wrote:  Задачка геморная, но для локализации необходимая. Аргументы я привел, а выбор всегда за разработчиком  Эта задачка мне не по силам. По поддержке json на том языке программирования, на котором я делаю ERA+, нет абсолютно ничего, т.к. сам json сделан под JavaScript и совершенно не подходит под Ассемблер. Только настоящий гений или псих захочет добавлять поддержку json на низкоуровневом языке. Это такой геморрой, что проще всё же перевести весь текст Промтом, как это делали пираты в далёком 1999 году ещё до Буки. Возможно, в будущем найдутся желающие, если о ERA+ вообще кто-нибудь вспомнит лет через 5... А может, ERA+ всё-таки станет популярной, тогда и тот же промтовский перевод не заставит себя ждать...
 
6 лет назад просили,   чтобы в МоР 3.1Х, был локализован английский язык, в новых опциях. Я был начинающим писателем на ассемблере и в отладке, но мне удалось быстро найти решение задачи:
 
Путь файлы: 
ModsText\Rus\*.txt 
ModsText\Eng\*.txt
   
Готовые коды из МоР 3.1Х:
 
Code:
 proc WERD...
 
 mov eax, [V_var_1]
 .if ~byte [eax]
 ...
 lstrcat ModsTextQ, "Eng\"
 printf ModsTextTMP,ModsTextQ  ;       Скопировать
 mov [ЯзыкКод],1
 ...
 .elseif ;
 lstrcat ModsTextQ, "Rus\"
 printf ModsTextTMP,ModsTextQ  ;       Скопировать
 mov [ЯзыкКод],0
 .endif
 
 
 
 
 ret
 endp
 ModsTextTMP db "\MoP\ModsText\XXX\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",0
 
 proc Load_Werd_Txt
 mov al,byte[55C018h]
 push eax
 mov byte[55C018h],0EBh
 call LoadTXT1
 call LoadTXT2
 call LoadTXT3
 call LoadTXT4
 pop eax
 mov byte[55C018h],al
 
 retn
 endp
 
 
 
 proc LoadTXT1     ; ESP
 LoadTxt _Werd_txt
 test eax, eax
 jnz @f
 retn
 @@:
 push edi esi
 xor ecx, ecx
 mov esi, [eax+20h]
 mov edi, WERD_TXT
 mov ecx, Количество_строк_в_Werd_txt
 rep movsd; копирование таблицы ссылок на строки в буфер WERD
 mov al, 2
 pop esi edi
 ret
 endp
 
 proc LoadTXT2
 mov eax,[ЯзыкКод]
 lstrcat ModsTextTMP, [(eax+0)*4+WERD_TXT]
 
 LoadTxt    ModsTextTMP
 
 test eax, eax
 jnz @f
 retn
 @@:
 push edi esi
 xor ecx, ecx
 
 mov esi, [eax+20h]
 pushad
 vAlloc 900*4;2097152
 mov dword[Замена_тюрем_на_выбранный_объект_TXT],eax
 popad
 mov edi, dword[Замена_тюрем_на_выбранный_объект_TXT]
 mov ecx, 300
 rep movsw; копирование таблицы ссылок на строки в буфер WERD
 mov al, 2
 pop esi edi
 ret
 endp
 
 proc LoadTXT3
 printf ModsTextTMP,ModsTextQ  ;       Скопировать
 mov eax,[ЯзыкКод]
 lstrcat ModsTextTMP, [(eax+2)*4+WERD_TXT]
 
 LoadTxt ModsTextTMP
 
 test eax, eax
 jnz @f
 retn
 @@:
 push edi esi
 xor ecx, ecx
 mov esi,  [eax+20h]
 pushad
 vAlloc 1220*4;2097152
 mov dword[Замена_Нейтральных_Городов_на_выбранный_объект_TXT],eax
 popad
 mov edi, dword[Замена_Нейтральных_Городов_на_выбранный_объект_TXT]
 mov ecx, 1120
 rep movsw; копирование таблицы ссылок на строки в буфер WERD
 mov al, 2
 pop esi edi
 ret
 endp
 
 proc LoadTXT4
 printf ModsTextTMP,ModsTextQ  ;       Скопировать
 mov eax,[ЯзыкКод]
 lstrcat ModsTextTMP, [(eax+4)*4+WERD_TXT]
 
 LoadTxt ModsTextTMP
 
 test eax, eax
 jnz @f
 retn
 @@:
 push edi esi
 xor ecx, ecx
 mov esi,  [eax+20h]
 pushad
 vAlloc 50*4;2097152
 mov dword[Экспертная_разведка_TXT],eax
 popad
 mov edi, dword[Экспертная_разведка_TXT]
 mov ecx, 52;52/2=26;48 ; 48            /       2       =        24
 rep movsw; копирование таблицы ссылок на строки в буфер WERD
 mov al, 2
 pop esi edi
 ret
 endp
 
Вызов функции:
 
Code:
 mov esi, dword[Экспертная_разведка_TXT]mov eax,dword[2*4+esi];Глубина
 mov ecx,dword[3*4+esi];Ваша эффективность раскопки
 
---
 
Можно улучшить функции на ассемблер, например, автоматическое вычисление количество строк с расширением массивов.
 
Code:
 proc Load_Werd_Txtmov al,byte[55C018h]
 push eax
 mov byte[55C018h],0EBh
 ;---
 mov eax,5BC024h
 mov byte[eax],0E8h;call
 inc eax
 mov ecx,Hook_LoadTXT_Count-4-5BC024h
 mov dword[eax],ecx
 mov word[eax+4],9090h
 
 call LoadTXT1
 stdcall NewLoadTXT, [(eax+0)*4+WERD_TXT],Замена_тюрем_на_выбранный_объект_TXT
 stdcall NewLoadTXT, [(eax+2)*4+WERD_TXT],Замена_Нейтральных_Городов_на_выбранный_объект_TXT
 stdcall NewLoadTXT, [(eax+4)*4+WERD_TXT],Экспертная_разведка_TXT
 pop eax
 mov byte[55C018h],al
 mov dword[5BC024h],804295;000C45C7h
 mov dword[5BC024h+3],0
 retn
 endp
 
 proc Hook_LoadTXT_Count
 mov dword[NewLoadTXT_Count],edx
 mov dword [ebp+0Ch], 0
 ret
 endp
 
 
 
 NewLoadTXT_Count dd 0
 proc NewLoadTXT WERD_TXT_INDEX, SetMemory
 mov dword[NewLoadTXT_Count],0
 mov eax,[ЯзыкКод]
 lstrcat ModsTextTMP, dword[WERD_TXT_INDEX];
 LoadTxt ModsTextTMP
 .if ~eax
 retn
 .endif
 push edi esi
 xor ecx, ecx
 mov esi,  [eax+20h]
 mov edx,dword[NewLoadTXT_Count]
 push edx
 shl edx,2; *4
 vAlloc edx;
 mov edx,dword[SetMemory]
 mov dword[edx],eax
 mov edi, eax;
 pop ecx;mov ecx,dword[NewLoadTXT_Count]
 shl ecx,2; *2
 rep movsw; копирование таблицы ссылок на строки в буфер WERD
 mov al, 2
 pop esi edi
 ret
 endp
  (14.04.2023 01:42)XEPOMAHT Wrote:   (14.04.2023 00:16)Elmore Wrote:  json как раз для разработчиков удобнее в первую очередь. Лично мне, как разработчику, проще всего встраивать весь текст в DLL. Когда-то в ERA+ так и было. Потом постепенно вынес весь текст в txt, с этим тоже тогда пришлось намучаться, повторять этот процесс с json страшно. В производственный ад спускаться не хочу (сначала просили txt, теперь нужны json, завтра - ещё какой-нибудь новый формат... в итоге когда мод доделывать?).
 
Потом скажут, что очень удобный формат CSV (EXCEL разделители -запятые)   .
			 
 
 
 
Heroes 3 MoP Fan-Patch 3.14MoP Key Delete RandomMapTavernVideos BIK ASM 
				
(This post was last modified: 15.04.2023 09:26 by myoffice91.)
 |