У кого то скрипт "волшебство 2" работает. Я проверил на нескольких версиях Era + WoG - результат везде один. Описание навыка корректное, а к силе ударной магии по прежнему +5, +10, +15% вместо 10, 20, 30 как заявлено.
Потому что оригинальный скрипт вообще не учитывает "Волшебство II" (v7198=1). Видимо автор скрипта недоглядел.
И да, это не совсем та тема. Лучше такие вопросы задавать в теме по ERM скриптам
(21.05.2016 21:36)igrik Wrote: [ -> ]Потому что оригинальный скрипт вообще не учитывает "Волшебство II"
Спасибо. А как сделать, чтобы в колдовской книге в походном режиме правильный урон показывался, а не только в битве? Сейчас разный урон отображается - в битве с учётом правки в триггере битвы.
И ещё - специализация героя по вторичному навыку "волшебство" никак не учитывается. То есть, независимо от уровня у такого героя бонус к силе заклинания +10, 20, 30% со включённым скриптом. Этот то момент я поправлю своим умом - с описанием в походной книге урона помощи прошу. И что-то мне подсказывает, что с другими специализациями на вторичных навыках тоже могут быть ошибки и логические несостыковки.
PS: Вообще у меня складывается впечатление, что в этой группе не хватает тестировщиков. Люди пишут скрипты зашкаливающей сложности, а проверить нормально по тесткейсам не хотят. Причем чем проще скрипт - тем хуже он протестирован. Поэтому все в Хоту и играют.
(30.05.2016 13:59)Heromant Wrote: [ -> ]с описанием в походной книге урона помощи прошу.
Посмотрю что можно сделать. Только что вы используете WoG или ERA?
(30.05.2016 13:59)Heromant Wrote: [ -> ]И что-то мне подсказывает, что с другими специализациями на вторичных навыках тоже могут быть ошибки и логические несостыковки.
Вполне может быть. Тестировать нужно под разными призмами.
(30.05.2016 13:59)Heromant Wrote: [ -> ]PS: Вообще у меня складывается впечатление, что в этой группе не хватает тестировщиков. Люди пишут скрипты зашкаливающей сложности, а проверить нормально по тесткейсам не хотят. Причем чем проще скрипт - тем хуже он протестирован. Поэтому все в Хоту и играют.
Потому что стандартным воговским скриптам уже чуть больше 10 лет. Че их тестировать то уже, хотя недочеты потихонку ещё всплывают.
А тестировать - дело нудное, долгое и неинтересное. Кто ж так делает

Как сказал однажды feanor - "Ну и Кибераллах с ними".
(31.05.2016 11:15)igrik Wrote: [ -> ]Посмотрю что можно сделать. Только что вы используете WoG или ERA?
ERA +WoG, как мод, + LORD, как мод + ещё всякая незначительная мелочёвка - ERM скрипты.
Кто-нибудь знает как сделать для стрелка стрельбу по площади (как магоги и личи)?
В базе по адресу 0041ED00 находится такая вот вещь, пытался заменить номер монстра в проверке на другой, но эффект удара по площади не приобретается
int v4; // eax@1
int *v5; // edx@1
_CombatMonster_ *v6; // ebx@1
int v7; // edi@1
void *v8; // esi@1
char *v9; // esi@6
int v10; // edi@13
int v11; // eax@14
int v12; // eax@21
_CombatMan_ *v14; // [sp+1Ch] [bp-30h]@1
int v15; // [sp+20h] [bp-2Ch]@14
signed int _result; // [sp+24h] [bp-28h]@1
int v17; // [sp+28h] [bp-24h]@5
int v18; // [sp+2Ch] [bp-20h]@1
unsigned int v19; // [sp+30h] [bp-1Ch]@12
int v20; // [sp+34h] [bp-18h]@1
_CombatMonster_ *v21; // [sp+38h] [bp-14h]@1
char v22; // [sp+3Fh] [bp-Dh]@1
v5 = a3;
v7 = a3[9];
v20 = a3[8];
v6 = 0;
v8 = 0;
v14 = this;
_result = -1;
v18 = a3[9];
v22 = 0;
v21 = 0;
v4 = mon->Type;
if ( v4 == 45 || v4 == 64 || v4 == 65 )
v22 = 1;
v17 = 0;
if ( *(&this->HeroAMonCount + v7) > 0 )
{
v9 = (char *)&this->Monsters[21 * v7].Flags;
while ( (*(_DWORD *)v9 >> 21) & 1
|| *((_DWORD *)v9 - 20) == 149
|| *((_BYTE *)v5 + 9) && !combatMonster_GetFullHealth((_CombatMonster_ *)(v9 - 132), 1) )
{
LABEL_36:
v9 += 1352;
++v17;
if ( v17 >= *(&v14->HeroAMonCount + v7) )
{
v8 = 0;
goto LABEL_38;
}
v5 = a3;
}
v19 = *((_DWORD *)v9 - 19);
if ( v22 )
{
v10 = CombatMonster_0041EF20_AIGetExplosiveShotAttackWeight(mon, *((_DWORD *)v9 - 19), v20, a3);
if ( *v9 & 1 )
{
v11 = combatMonster_GetMonSecondSquarePosition((_CombatMonster_ *)(v9 - 132));
v15 = CombatMonster_0041EF20_AIGetExplosiveShotAttackWeight(mon, v11, v20, a3);
if ( v15 > v10 )
{
v10 = v15;
v19 = combatMonster_GetMonSecondSquarePosition((_CombatMonster_ *)(v9 - 132));
}
v6 = v21;
}
if ( v10 < 0 )
goto LABEL_35;
}
else
{
v10 = CombatUnk_00435900_AIGetCreatureRangedAttackWeight(a3, mon, (_CombatMonster_ *)(v9 - 132));
}
if ( !v6
|| ((v12 = *((_DWORD *)v9 + 131), !v12) && !*((_DWORD *)v9 + 139) && !*((_DWORD *)v9 + 143)
|| v6->SpellDuration[62]
|| v6->SpellDuration[70]
|| v6->SpellDuration[74])
&& (!v12
&& !*((_DWORD *)v9 + 139)
&& !*((_DWORD *)v9 + 143)
&& (v6->SpellDuration[62] || v6->SpellDuration[70] || v6->SpellDuration[74])
|| v10 >= *weight) )
{
_result = v19;
v21 = (_CombatMonster_ *)(v9 - 132);
*weight = v10;
v6 = (_CombatMonster_ *)(v9 - 132);
}
LABEL_35:
v7 = v18;
goto LABEL_36;
}
LABEL_38:
delete(v8);
return _result;
Можно изменить тип существа перед атакой, а потом вернуть как было.
Не там смотришь. Твой адрес видимо для определения ценности выстрела для AI.
А тебе нужно смотреть в функции по адресу 0x0043F620
Например, подменить магога !!UN:C4454190/1/[номер монстра 0...127];
Все воговские скрипты надо не тестировать, а тупо переделывать под эру, под её возможности и её принципы. А там где не хватает - допиливать эру.
Вот например кому вообще это Волшебство Два нужно скриптом, когда тот же функционал достигается бинарником в шестнадцать байт?
..но это еще более никому не надо.
gamecreator, igrik спасибо!
(30.05.2016 13:59)Heromant Wrote: [ -> ]... с описанием в походной книге урона помощи прошу.
В этом плане согласен с
feanor'ом.
Но коль нужно, то держи скрипт.
Для работы нужен "
erm_hooker.era", который положишь в папку "EraPlugins"
Кстати, в предпросмотре сообщения не работает тег [erm]
Добрый вечер! Вопрос к программистам. Есть функция, которая определяет доход города (скопировано с базы ИДЫ Феанора):
Code:
//----- (005BFA00) --------------------------------------------------------
signed int __thiscall Town_GetGoldIncome(int this, char a2)
{
signed int result; // eax@1
int v3; // edi@1
int v4; // esi@1
int v5; // edx@9
v4 = *(_DWORD *)(this + 336);
v3 = *(_DWORD *)(this + 340);
result = 500;
if ( __PAIR__(
(unsigned int)TownHallMask2 & *(_DWORD *)(this + 340),
(unsigned int)TownHallMask & *(_DWORD *)(this + 336)) )
result = 1000;
if ( CityHallMask2 & v3 | CityHallMask & v4 )
result = 2000;
if ( CapitolMask2dword & v3 | CapitolMask & v4 )
result = 4000;
if ( a2 )
{
if ( ResSiloMask2 & v3 | (unsigned int)ResSiloMask & v4 )
{
v5 = *(_BYTE *)(this + 4);
LOWORD(v5) = LOWORD(TownsResourceSilo[7 * v5 + 6]);
result += v5;
}
}
if ( __PAIR__((unsigned int)GrailMask2 & *(_DWORD *)(this + 348), (unsigned int)GrailMask & *(_DWORD *)(this + 344)) )
result += 5000;
return result;
}
// 66CDF0: using guessed type int TownHallMask;
// 66CDF4: using guessed type int TownHallMask2;
// 66CDF8: using guessed type int CityHallMask;
// 66CDFC: using guessed type int CityHallMask2;
// 66CE00: using guessed type int CapitolMask;
// 66CE04: using guessed type int CapitolMask2dword;
// 66CE6C: using guessed type int GrailMask2;
// 688F04: using guessed type int TownsResourceSilo[63];
Первый вопрос, как правильно понимать данное условие:
Code:
if ( __PAIR__(
(unsigned int)TownHallMask2 & *(_DWORD *)(this + 340),
(unsigned int)TownHallMask & *(_DWORD *)(this + 336)) )
, вижу что проверка на построенный таунхолл, но что именно происходит в условии не понимаю.
Второй вопрос, как с помощью длл добавить еще одно условие перед return result: если город Темница, и построен торговец артефактами то доход +100? У меня есть скрипт, который писал на ЕРМ, он просчитывает количество темниц, проверяет постройку здания, а потом прибавляет залото в начале хода, но хочеться научиться писать подобные штуки в Microsoft Visual C++, кроме того есть планы модифицировать под себя еще кое-какие функции, но очень нужен хоть один пример, по аналогии с которым я бы потихоньку начал разбираться дальше
На место return result; вставить хук и изменить этот самый result. В ERM это через erm hooker делается, а в плагине просто вместо возврата записываешь прыжок на твою функцию, которая __declspec(naked), и там уже изменяешь и возвращаешь результат. Сходу код не могу выдать, это надо с адресами копаться (посмотреть где result, куда вписывать хук и т.п.). Тут же важно ещё и понимать язык ассемблера, одного знания С++ недостаточно.
А что за база Феанора? Можно ссылку?
По той функции дохода из поста выше. Утром набросал ерм скрипт, в котором ставлю хук и изменяю result. Скрипт записывает в result 5000.
Теперь голову ломаю, как считать номер города и флаг здания, чтоб добавить условие... здесь моих знаний пока не хватает