(22.02.2012 21:57)packa Wrote: Есть какие нибудь проблемы в создании нормальной, обычной мапы для МОП?
И можно ли конвертнуть ВоГ карту в МоП?
Создать можно, но с указанными оговорками о RB и строительстве городов.
Конвертнуть - нет. Причина: многие старые артефакты в MoP имеют совершенно другие номера.
(22.02.2012 22:56)am haarec Wrote: какие такие големы ?!? Не камень /не глина/ не метал/ не "материя" стихий
Плоть и кровь -,значит ПОЛОЖЕНО
"Как големы" - не значит, что големы и есть. Я полагал, что наличие Боевого Духа у RB может обернуться слишком фатальным исходом для войск героя.
А вообще, почему бы не воспользоваться редактором монстров? Там можно дать RB БД, ответки и ещё кучу всякого добра. А если параметры менять - продвинутые могут достать из h3mop.lod файл MCrTrait.txt.
(22.02.2012 22:56)am haarec Wrote: ...да,хотелось бы ещё файлик крохотный, позволяющий расти существам в Банках вместе с ростом опыта;и нейтралам тоже росту опыта ,а то ведь несерьёзно как-то...
очень хотелось...
Сорри, я об этом совсем не думал. В ВОГ рост охраны банков вроде скриптом сделан?
(22.02.2012 23:15)packa Wrote: МоП Wrote:2. Стоит ли выносить Дуалит на панель ресурсов?
Не, не стоит. Слишком редко используется, чтобы быть на панели.
Вот и я так думаю. Да и панель больно уж сожмётся.
(22.02.2012 23:15)packa Wrote: А нельзя их вручную тыкать? Как обычных монстров...
Если нет, то нужно сделать
Так ты открой редактор карт и - behold.
Все там монстры есть, кроме Воздушного Шара. Ставь на карту, если надо.
(22.02.2012 23:30)kostya_76 Wrote: MOP, неужели трудно сделать замену высокоуровневых существ в смешанных охранах, если их файтвэлью превышает заданное? После округления их количества до единицы стало еще хуже, чем когда до нуля округлялось. Одно существо 8 лвл может увеличить силу охраны больше чем на порядок от необходимого уровня.
Поэтому введение было экспериментальным.
Когда я при переписывании кода на асме доберусь до смешанных нейтралов, тогда ещё раз пересмотрю алгоритм. Может, он будет совершенно другим.
***************************************
Наконец-то я понял, что за ошибка была у некоторых при обзоре королевства! Потому что сам её поймал и выяснил причину. В бинарном патче:
Code:
11D2AE E91ED22200 JMP mop.0074A4D1
Отсутствует точка с запятой. Странно, но BinGen это слепо пропускает, генерирует код прыжка, а дальше вставляет мусор, затирающий важный код, относящийся к реликвии, реализующей Портал Вызова.
Тут я, конечно, сообразил, что таких ошибок в тонне патчей, которым был подвергнут экзешник, наверняка не одна. Тем более, что и раньше встречался с таким попустительством BinGen. Попробовал сначала этот же патч на BinMagic – тот ошибку показал. Тогда я, сделав для страховки бэкап старого батника, весь батник перевёл на BinMagic (а ведь хотел же, блин, ещё до релиза, но лень не дала), запустил его – и понеслась... Выдало нагора штук 30-40 ошибок в разных файлах. Где отсутствует точка с запятой, а где вместо неё – двоеточие. Довольно немало, но по сравнению с общим объёмом патчей (десятки тысяч) это повод меня убить всё-таки не даёт.
Но на этом сюрпризы не кончились. Экзешник, созданный BinMagic-ом, оказался нерабочим! О_о. Патчился он правильно, PatchFor=File, и даже запускается. Но при запуске выдаёт ошибки ERM (который, по идее, вырублен WERD-ом), а при старте карты вылетает с криком. Пораскинул мозгами, убрал опцию Optimize (всё равно в данном случае она бессмысленна, так как bin-ы удаляются сразу после патчинга). Все симптомы исчезли.
Чуть позднее понял, что Optimize некорректно работает, если несколько патчей имеют один адрес. Конкретно, у меня там два:
Code:
2A0685 B8B0BF5800; MOV EAX,mop.0058BFB0
2A0685 61; POPAD
2A0686 C705F7FB400000000000; MOV DWORD PTR DS:[40FBF7],0
По идее, как при оптимизации, так и без неё, последний патч должен корректно перекрывать предыдущий. Но получается бред.
Code:
00705685 B8 C705F7FB MOV EAX,FBF705C7
0070568A 40 INC EAX
0070568B 0000 ADD BYTE PTR DS:[EAX],AL
0070568D 0000 ADD BYTE PTR DS:[EAX],AL
Как видно, программа проигнорировала popad, вставив в адрес ранее указанный опкод mov eax. Логика кода совершенно испорчена.
Конечно, можно на это ответить: «Не налагай патчи друг на друга». Но легко представить себе ситуацию, когда это необходимо. Дан исходник с одной километровой строкой патча. Код его посмотрен в отладчике. Выяснена ошибка или требуется модификация где-то в середине этой строки. Гораздо проще наложить патч поверх, чем лезть разбирать, где в этом чудовище нужный адрес. Да ещё и ошибок не наберёшься, если сместишь этот код по рассеянности на +/- 1 байт.
Но вернусь к началу. Исправление, к сожалению, выкладывать рискованно, так как после релиза exe был подвергнут ещё сотням патчей и не факт, что в исправление не проникнет код RtL, который убъёт старый exe S & D в каком-нибудь месте.
Конкретно исправление для Обзора Королевства можно было бы сделать патчем, но больно уж мелкая это бяка, а я не люблю плодить мелочи. В общем, либо последнего стабилизирующего патча S & D не будет, либо как-нибудь летом наберём того-сего и слепим.
P.S.: Ещё немного о fasm и WERD для заинтересованных:
Хм... сделал в WERD универсальный способ вызова функций с помощью нехитрого макроса:
Code:
macro fn proc,[arg]
{
include 'FUNCTIONS\PROTO.inc'
common
match =invoke, PROTO_#proc \{ invoke proc,arg \}
match =stdcall, PROTO_#proc \{ stdcall proc,arg \}
match =ccall, PROTO_#proc \{ ccall proc,arg \}
match =pascal, PROTO_#proc \{ pascal proc,arg \}
match =thiscall, PROTO_#proc \{ thiscall proc,arg \}
match =fastcall, PROTO_#proc \{ fastcall proc,arg \}
}
То есть, для любой функции можно ввести прототипирование по соглашению. В Файл PROTO.inc надо только добавить запись типа:
Code:
define PROTO_Заполнение_памяти_указанным_значением stdcall
И можно вызывать её через "fn" - макрос сам разберётся, как оформить вызов. При этом ничего не мешает вызывать процедуры, как и раньше, с явным указанием соглашения или просто call-ом.
Правда, если у функции нет прототипа или он неправильный, fasm ошибку не выдаст (надо, впрочем, как-то исправить), однако и не скомпилирует ни хрена.
Кстати, о самих макросах соглашений. Если первые три и так были в fasm-e, то другую половину пришлось пилить самому. pascal - просто перевёрнутый stdcall:
Code:
macro pascal proc,[arg]
{
common
if ~ arg eq
forward
pushd arg
common
end if
call proc
}
thiscall и fastcall - с некоторой оптимизацией скорости и размера, если параметр ecx/edx - непосредственное значение, лежащее в пределах -1 ... 1:
Code:
macro thiscall proc, var, [arg]
{
common
if ~ arg eq
reverse
pushd arg
common
end if
if var eqtype 0
if var = 0
xor ecx, ecx
else if var = -1
or ecx, -1
else if var = 1
xor ecx, ecx
inc ecx
else
mov ecx, var
end if
else
mov ecx, var
end if
call proc
}