Pull to refresh

Comments 24

В казаков не играю а вот реверс-инжиниринг тема интересная. Спасибо за статью.
А разве в "Казаках" не было возможности зациклить производство на бесконечность? Или эта фича уже в "Завоевании Америки" появилась?
Была, но в некоторых случаях она не так удобна, как кажется. Например, цена наёмных драгунов в дипломатическом центре растёт с каждым драгуном, которого вы уже наняли. Т.е. намного дешевле сразу заказать 500 единиц, чем ставить на бесконечность. Или если вы хотите не отвлекаясь заказать подряд ровно по взводу пикинёров и мушкетёров в одной казарме или чередовать производство каждые 50 единиц.
Хм, ну тоже правда. Тогда было бы ещё круче, кстати, если бы отряды сами формировались. В духе Supreme Commander.
Мне нравится как в planetary annihilation: titans (не знаю как в первой части, но скорее всего также) сделано. Там можно задать очередь вида: 2 танка одного типа, 1 второго, 3 третьего, повторить.
Вторая причина в том, что в отличии от регистра cx мне больше не требуется префикс 0x66, а это экономия одного байта на каждой операции с регистрами кроме mov.

Собственно, а назачем было в 32битном режиме изначально использовать cx вместо ecx?

я и решил использовать вместо loop обычную комбинацию из inc, cmp и jl, в качестве регистра-счётчика я всё равно оставил cx

Зачем inc и cmp, если можно dec и jnz?

То же самое с ebx и esi: можно было использовать один регистр.
Да, без ошибок не обошлось. По поводу регистра cx: к нему я пришёл, когда искал информацию про циклы в асм. В конце концов я от него отказался, как и от использования loop. Ну а на счёт dec и jnz вы, конечно, правы. Как-то даже стыдно, что сам не додумался. С другой стороны, как я уже писал, опыта с ассемблером до реверса «Казаков» у меня не было от слова совсем. Так что спасибо за совет, в следующий раз учту)
В 32-битном режиме loop контролируется регистром ecx, не cx.
Точно, спасибо. Видимо, информация на том сайте относилась к архитектуре 8086.
Да, там тоже смотрел… Недостаточно тщательно. Зато сейчас вижу: том 2А, страница 3-496.

То есть, я мог бы сделать и так?
mov     ecx, 01h    B9 01 00 00 00
[...]

: Цикл
push    ecx         51
[...]
pop     ecx         59
loop                E2 ..

mov ecx, 24h

не 01h.

Да. Или так, чтобы не возиться со стеком, раз уж у нас stdcall:

mov esi, 24h
m1:

цикл

dec esi
jnz m1
не 01h
В самом начале присваивается 0x01 на случай «обычного» заказа одной единицы, затем в сависимости от результатов GetKeyState другие значения (в примере выше 0x05, 0x14, 0x32, 0x0F или 0x24).

раз уж у нас stdcall
Честно говоря, достоверно мне это известно не было. Как можно проверить, что exe'шник придерживается calling convention и что регистр esi можно безопасно использовать?

И в случае stdcall я ведь всё равно обязан положить esi на стек, прежде чем использовать его в патче, а затем восстановить, не так ли?
Честно говоря, достоверно мне это известно не было. Как можно проверить, что exe'шник придерживается calling convention и что регистр esi можно безопасно использовать?

Никак — посмотреть какие регистры сохраняет/использует фнукция, как она работает со стеком (c call/sdtcall/pascal). Если честно, я посмотрел по диагонали, но опирался на вашу врезку с cx/ecx/loop и это:

В этот раз я решил использовать регистр ebx для сохранения количества исполнений цикла и регистр esi как счётчик цикла. Для этого есть две причины. Следуя соглашению о вызове функций эти регистры являются «постоянными», т.е. если в теле функции в них вносятся изменения, то функция обязана сохранить их значения в стеке и восстановить их перед завершением.

И в случае stdcall я ведь всё равно обязан положить esi на стек, прежде чем использовать его в патче, а затем восстановить, не так ли?

Да, я имел в виду сохранение/восстановление в цикле.
Добро дело делаете. Вы большой молодец.!
Вы дизассемблировали логику игры, я снимаю шляпу… Огромный труд.
Спасибо !
А у вас нет в планах изменить потребность войск в жилье? На мой взгляд, это самый раздражающий момент в Казаках — необходимость полкарты домиками застраивать.
Домики — стратегическая часть игры, вы должны удерживать территорию, чтобы было место куда их воткнуть и должны потом ее защищать, чтобы их не захватили и не уничтожили. Плюсом это сильно меняет логику игры, тогда как патчи на очередь и на скорость игры ее никак не затрагивают, а только помогают улучшить юзабилити.
Так я и не говорю о том, чтобы совсем от них отказаться. Речь о том, что когда с миллионами ресурсов играешь, домиков нужно строить сотни (что само по себе угнетающе монотонно), и в какой-то момент их стоимость взлетает до запредельных значений, и по-настоящему большую армию создать нет возможности. В конце концов, это Казаки, а не Сим Сити. Так что поправочный коэффициент на стоимость и/или вместимость домиков, мне кажется, был бы весьма уместен.
Вы не правы, я как многократный победитель турниров на миллионах говорю что там все сбалансировано, есть нации где хотелось бы получше — алжир, но она тем и примечательна. Во всех остальных же Городские центры и Казармы 18 века дают достаточно места для построения огромных армий.
А сколько "Городских центров" вы строили на миллионах? Я несколько лет не играл, но, насколько я помню, уже пятый получается баснословно дорогим, равно как и в случае с "Казармами" XVIII в. (всегда строил по четыре штуки того и другого). Может, конечно, я чего-то недопонял в игровой механике, но после этого мне приходилось приниматься за массированную застройку домами.
если смотреть самую популярную номинацию DEF 10 пт, то стандартная застройка — 6 гц, 4 казармы 17 века, 8 конюшен, 6 казарм 18 века, 6 церквей, остального по 1му.
Можно экономить ресурсы и строить 5 гц и 5 церквей, всех больше места дает казарма 18 века. Чтобы построить данное кол-во зданий надо правильно использовать рыночный механизм в игре, ну или просто знать обмен)
Строил максимум один дом (наверное для открытия других возможностей) или не строил вообще, уже не помню. В основном создавал несколько городских центров, компактнее чем дома строить + сразу рабочая сила из нескольких источников генерировалась. При этом увеличивалось максимальное количество населения, которое можно создать.
Естественно, что "Городских центров" нужно строить больше одного. Я говорю о ситуации, когда построить следующий уже нет возможности.
Sign up to leave a comment.

Articles