(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_Txt
mov 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.14
- MoP Key Delete RandomMap
- TavernVideos BIK ASM
(This post was last modified: 15.04.2023 09:26 by myoffice91.)
|