Код Героев я вижу примерно так теперь:
- Код: Выделить всё
void __thiscall TGame::InitTown(TGame *this, char town_id, bool isAI)
{
__int16 buildings; // dx
__int16 v4; // dx
__int16 value; // [esp+4h] [ebp-44h]
char v7[12]; // [esp+8h] [ebp-40h]
int i; // [esp+14h] [ebp-34h]
int level; // [esp+18h] [ebp-30h]
__int16 v10; // [esp+1Ch] [ebp-2Ch]
__int16 spell_id; // [esp+20h] [ebp-28h]
char type; // [esp+24h] [ebp-24h]
char Spell[29]; // [esp+28h] [ebp-20h] BYREF
v7[0] = 1;
v7[1] = 1;
v7[2] = 1;
v7[3] = 2;
v7[4] = 1;
v7[5] = 1;
v7[6] = 1;
v7[7] = 2;
v7[8] = 1;
v7[9] = 3;
v10 = v7[RandInt(0, 99) / 10];
type = this->town[town_id].type;
if ( this->town[town_id].edited )
{
for ( i = 0; i < 6; ++i )
{
if ( ((1 << (i + 7)) & this->town[town_id].buildings) != 0 )
this->town[town_id].num_creatures[i] = akCreatureTypeTraits[dbTownCreaturesId[type][i]].growth;
}
}
if ( !this->town[town_id].edited )
{
buildings = this->town[town_id].buildings;
LOBYTE(buildings) = buildings | 0x80;
this->town[town_id].buildings = buildings;
this->town[town_id].num_creatures[0] = akCreatureTypeTraits[dbTownCreaturesId[type][0]].growth;
if ( isAI && v10 == 1 && RandInt(1, 10) < 4 )
++v10;
if ( --v10 )
{
v4 = this->town[town_id].buildings;
HIBYTE(v4) |= 1u;
this->town[town_id].buildings = v4;
this->town[town_id].num_creatures[1] = akCreatureTypeTraits[dbTownCreaturesIdTier1[type][0]].growth;
--v10;
}
}
qmemcpy(Spell, 0, 29u);
for ( i = 0; i < 9; ++i )
{
if ( i > 2 )
{
if ( i > 4 )
{
if ( i > 6 )
level = 3;
else
level = 2;
}
else
{
level = 1;
}
}
else
{
level = 0;
}
do
{
spell_id = dbMageGuildSpells[level][RandInt(0, 7)];
if ( isAI )
value = ((dbSpellTypes[spell_id] & 1) != 0 ? 4 : 1) * dwSpellValues[spell_id] + 50;
else
value = 1500;
if ( spell_id == eSpellDimensionDoor )
value = 1500;
}
while ( Spell[spell_id] || RandInt(1, 1500) >= value );
this->town[town_id].spells[i] = spell_id;
Spell[spell_id] = 1;
}
}
Т.е. он не сильно отличается от реального кода Фила На основании этого кода я дополню статью про вероятности выпадения заклинаний в магической гильдии. Вы уже наверняка можете видеть, что именно с Героев 1 начинает своё путешествие основной код следующих частей. Например, выбор заклинаний для AI в Героях 2 вообще не претерпел никаких изменений. Кроме того, этот фрагмент кода позволяет точно узнать вероятность наличия двеллинга второго уровня в городе. Но вычисление этой вероятности не такое простое предприятие, как кажется. Просто посмотрите на инициализацию массива в самом начале. Вот за это мне и нравится код Героев 1: за то, что даже листинг не проливает свет на настоящее положение дел
А вот как разработчики вставляют в код читы для AI:
- Код: Выделить всё
if ( isAI && v10 == 1 && RandInt(1, 10) < 4 )
++v10;
У меня уже накопилось достаточное кол-во информации, чтобы перечислить большинство из них. Но с уверенностью можно сказать, что в те времена читы AI нивелировали его слабые места и это было нормой. Думаю, и сейчас норма Ведь написать AI, лишённый читов, не так просто. И только относительно простые игры, например, как шахматы, поддаются анализу. А Герои 1 уже на несколько порядков сложнее, чем шахматы. Все говорят про всемогущий AI, но его нужно ещё обучить. И самая сложная задача - написать адекватный алгоритм обучения. А кто его будет писать? Точно не AI. Это я про то, что человек всегда будет оставаться выше AI. Я даже не верю, что AI однажды сможет повторить наш разум. Но это уже философия. Конечно же, с точки зрения философии AI, который способен делать всё то, что делает человек, неотличим от человека. Поэтому мы в какой-то степени тоже чей-то AI (например, Бога).