A.I.M. Jagged Alliance2

Добро пожаловать, Гость. Пожалуйста, выберите:
Вход || Регистрация.
29.03.2024 в 15:34:30

Главная Главная Помощь Помощь Поиск Поиск Участники Участники Вход Вход Регистрация Регистрация
A.I.M. « Наука и религия в исходниках НО. »
Тут обсуждают, что Терапевт должен сделать, чтобы мне было хорошо.

   A.I.M.
   Обсуждаем игры
   Night Ops
(Модераторы: ПМ, Терапевт, maks_tm)
   Наука и религия в исходниках НО.
« Предыдущая Тема | Следующая Тема »
  Тема:  Наука и религия в исходниках НО.             Страниц:  1     « Открыть сокрытое! »Прочитано 68530 раз
Терапевт
[Кулибин]
Кардинал


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: Наука и религия в исходниках НО.
« Ответ #212 от 31.05.2016 в 14:42:29 »

2Seven:  
Данная историческая ошибка теоретически чревата лишь какими-то глюками с транспортом игрока при наличии сразу двух машин. Например, NPC не сможет заправить вторую машину, если есть квест с такой реакцией. Причём она такая не единственная, есть ещё.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #213 от 14.07.2017 в 20:44:24 »

Вопрос знатокам.
 
В функции UseGun есть такой вызов:
FireBulletGivenTarget( pSoldier, dTargetX, dTargetY, dTargetZ, pSoldier->usAttackingWeapon, (UINT16) (uiHitChance - uiDiceRoll), fBuckshot, FALSE );
При этом FireBulletGivenTarget определена в LOS.h как  
INT8 FireBulletGivenTarget( SOLDIERCLASS * pFirer, FLOAT dEndX, FLOAT dEndY, FLOAT dEndZ, UINT16 usHandItem, INT16 sHitBy, BOOLEAN fBuckshot, BOOLEAN fFake );
Для чего (uiHitChance - uiDiceRoll) преобразуется в UINT16, если передавать нужно INT16, причем отрицательное значение имеет смысл и означает величину промаха?
 
Например, вызов CalculateLaunchItemParamsForThrow в UseThrown производится корректно, с преобразованием в INT8:
 
CalculateLaunchItemParamsForThrow( pSoldier, sTargetGridNo, pSoldier->bTargetLevel, (INT16)(pSoldier->bTargetLevel * 256 ), &(pSoldier->inv[ HANDPOS ] ), (INT8)(uiDiceRoll - uiHitChance), THROW_ARM_ITEM, 0 );
« Изменён в : 14.07.2017 в 21:06:00 пользователем: Seven » Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Терапевт
[Кулибин]
Кардинал


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: Наука и религия в исходниках НО.
« Ответ #214 от 21.07.2017 в 15:34:42 »

14.07.2017 в 20:44:24, Seven писал(a):
Для чего (uiHitChance - uiDiceRoll) преобразуется в UINT16, если передавать нужно INT16, причем отрицательное значение имеет смысл и означает величину промаха?

Хотя по логическому смыслу это неправильно, но в данном случае не имеет значения к знаковому или беззнаковому типу происходит преобразование, главное, что к двухбайтовому, подходящему по размеру. Целое отрицательное число хранится, как положительное больше 32767. Например, -1 будет храниться, как 65535; -2, как 65534 и т.п. Таким образом знак числа при передаче в функцию не теряется, и все вычисления внутри выполняются корректно.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #215 от 21.07.2017 в 21:54:13 »

2Терапевт:  
А вот еще из исходников НО 1.2:
В UseGun():
Вычисляем шанс попасть:
Quote:
uiHitChance = CalcChanceToHitGun( pSoldier, sTargetGridNo, pSoldier->bAimTime, pSoldier->bAimShotLocation );

Затем случайное число:
Quote:
// ROLL DICE
uiDiceRoll = PreRandom( 100 );

Если uiDiceRoll <= uiHitChance, то это попадание, то есть пуля полетит точно в цель.
Quote:
fGonnaHit = uiDiceRoll <= uiHitChance;

и передается в FireBulletGivenTarget(  как sHitBy параметр:
Quote:
FireBulletGivenTarget( pSoldier, dTargetX, dTargetY, dTargetZ, pSoldier->usAttackingWeapon, (UINT16) (uiHitChance - uiDiceRoll), fBuckshot, FALSE );

Если sHitBy >=0, то это попадание.
Получается, что при вычисленном шансе попасть uiHitChance = 0, есть 1% вероятность реального попадания (uiDiceRoll = 0, 0<=0).
При вычисленном шансе uiHitChance = 1%, реальный шанс попасть будет 2% (0<=1, 1<=1).
 
Ванильный баг в AI функции SearchForItems:
Quote:
case ARMOURCLASS_VEST:
 if (pSoldier->inv[VESTPOS].usItem == NOTHING)
 {
  iTempValue = 200 + EffectiveArmour( pObj );
 }
 else if ( EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ) > EffectiveArmour( pObj ) )
 {
  iTempValue = 100 * EffectiveArmour( pObj ) / EffectiveArmour( &(pSoldier->inv[VESTPOS]) );
 }
 else
 {
  iTempValue = 0;
 }
 break;

Проверяем жилетку, а сравниваем броню поднимаемого объекта с броней шапки:
Quote:
else if ( EffectiveArmour( &(pSoldier->inv[HELMETPOS]) ) > EffectiveArmour( pObj ) )

Аналогично и со штанами.
Кроме того, EffectiveArmour() при определенных условиях может вернуть 0, что приведет к предсказуемым последствиям:
Quote:
INT8 EffectiveArmour( OBJECTTYPE * pObj )
{
 INT32  iValue;
 INT8  bPlate;
 
 if (pObj == NULL || Item[pObj->usItem].usItemClass != IC_ARMOUR)
 {
  return( 0 );
 }
...
}
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Терапевт
[Кулибин]
Кардинал


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: Наука и религия в исходниках НО.
« Ответ #216 от 22.07.2017 в 00:12:43 »

21.07.2017 в 21:54:13, Seven писал(a):
Ванильный баг в AI функции SearchForItems:

В НО боты не ищут броню. Ищут только оружие и патроны.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Bonarienz
[Хороший ариец]


Враг Джавдета в анимации ДжА2, Бон-а-рьен-ц!




Репутация: +346
Re: Наука и религия в исходниках НО.
« Ответ #217 от 22.07.2017 в 01:52:33 »

2Терапевт:  
 
Как же так? С Барреттом и голой жопой - впирёт на фрагА?!. Нипарядык!
Зарегистрирован

Deleatur (лат.) - Стереть все, совсем все!
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #218 от 30.08.2017 в 10:52:53 »

В CreatureDecideActionBlack()
Quote:
// DIGGLER ON   21.11.2010  
// Теперь у нас 2 процедуры на каждый случай жизни
#ifdef NEW_AI_STRUCT
 if ( gfTurnBasedAI || (gTacticalStatus.uiFlags & TURNBASED) )
  return(DecideActionRedTB(pSoldier,FALSE));
 else  
  return(DecideActionRedRT(pSoldier,FALSE));
#else
return(DecideActionRed(pSoldier,FALSE));
#endif
// DIGGLER OFF

Разве тут не должно вызываться CreatureDecideActionRed?
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Терапевт
[Кулибин]
Кардинал


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: Наука и религия в исходниках НО.
« Ответ #219 от 30.08.2017 в 23:27:28 »

Наверно да, но с оригинала идёт именно так.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #220 от 30.08.2017 в 23:34:14 »

2Терапевт:  
Судя по всему, это просто неудачная копипаста из DecideAction.c - там есть ровно такой же код - если единственный доступный для атаки противник умирает, ищем нормального и если находим, будем через Red AI к нему добираться, так как в Black AI нет поиска противника. То есть скопировать скопировали, а имя функции поменять забыли.
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #221 от 19.12.2017 в 18:31:33 »

Еще один ванильный баг в 1.2:
 
FindLocations.c
Quote:
UINT8 NumberOfTeamMatesAdjacent( SOLDIERCLASS * pSoldier, INT16 sGridNo )
{
 UINT8 ubLoop, ubCount, ubWhoIsThere;
 INT16 sTempGridNo;
 
 ubCount = 0;
 
 for( ubLoop = 0; ubLoop < NUM_WORLD_DIRECTIONS; ubLoop++ )
 {
  sTempGridNo = NewGridNo( sGridNo, DirectionInc( ubLoop ) );
  if ( sTempGridNo != sGridNo )
  {
   ubWhoIsThere = WhoIsThere2( sGridNo, pSoldier->bLevel );
   if ( ubWhoIsThere != NOBODY && ubWhoIsThere != pSoldier->ubID && MercPtrs[ ubWhoIsThere ]->bTeam == pSoldier->bTeam )
   {
    ubCount++;
   }
  }
 }
 
 return( ubCount );
}

 
Должно быть:
Quote:
ubWhoIsThere = WhoIsThere2( sTempGridNo, pSoldier->bLevel );

 
Из-за этого бага еще с оригинала не работает антискучивание в FindBestNearbyCover:
Quote:
iCurrentCoverValue -= (iCurrentCoverValue / 10) * NumberOfTeamMatesAdjacent( pSoldier, pSoldier->sGridNo );
...
iCoverValue -= (iCoverValue / 10) * NumberOfTeamMatesAdjacent( pSoldier, sGridNo );
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #222 от 29.10.2018 в 21:26:25 »

Ванильный баг в 1.2:  
 
opplist.c, HearNoise()
 
Quote:
if (ubVolume >= pSoldier->ubNoiseVolume)
{
 // yes it is, so remember this noise INSTEAD (old noise is forgotten)
 pSoldier->sNoiseGridno = sGridNo;
 pSoldier->bNoiseLevel = bLevel;
 
 // no matter how loud noise was, don't remember it for than 12 turns!
 if (ubVolume < MAX_MISC_NOISE_DURATION)
 {
  pSoldier->ubNoiseVolume = ubVolume;
 }
 else
 {
  pSoldier->ubNoiseVolume = MAX_MISC_NOISE_DURATION;
 }
 
 SetNewSituation( pSoldier );  // force a fresh AI decision to be made
}
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Терапевт
[Кулибин]
Кардинал


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: Наука и религия в исходниках НО.
« Ответ #223 от 30.10.2018 в 13:33:00 »

2Seven:  
И в чём он выражается?
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #224 от 30.10.2018 в 13:36:47 »

2Терапевт:  
MAX_MISC_NOISE_DURATION = 12
ubVolume - громкость, может быть до 100 и больше.
В существующем виде AI запоминает не самый громкий звук (и самый важный, как следствие), а просто любой последний громче минимального уровня в 12, что приводит к некорректному поведению AI.
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Терапевт
[Кулибин]
Кардинал


Народный целитель. Шарлатан высшей категории.




Пол:
Репутация: +1187
Re: Наука и религия в исходниках НО.
« Ответ #225 от 30.10.2018 в 16:57:46 »

2Seven:  
Понятно. Я бы сказал, что это не баг, а субъективный взгляд на данную примитивную линейную нормализацию величины. Ведь самый громкий звук необязательно будет самым важным. По крайней мере в случаях, когда игрок нападает на вражеский сектор.
Зарегистрирован

Весна! Я уже не грею пиво! (с) В.Цой
Seven
[Голос Америки]
Прирожденный Джаец




WWW

Пол:
Репутация: +351
Re: Наука и религия в исходниках НО.
« Ответ #226 от 10.11.2018 в 19:29:15 »

Ванильный баг в 1.2
 
Quote:
// set values for the tiles EXITED from this location
FORCE_SET_MOVEMENTCOST( usGridNo - WORLD_COLS, NORTH, 0, TRAVELCOST_NONE );
SET_MOVEMENTCOST( usGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo + 1, EAST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
FORCE_SET_MOVEMENTCOST( usGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_NONE );
SET_MOVEMENTCOST( usGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo - 1, WEST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo - WORLD_COLS - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );

Должно быть
Quote:
// set values for the tiles EXITED from this location
if (gubWorldMovementCosts[usGridNo - WORLD_COLS][NORTH][0] < TRAVELCOST_BLOCKED)
 FORCE_SET_MOVEMENTCOST(usGridNo - WORLD_COLS, NORTH, 0, TRAVELCOST_NONE);
ET_MOVEMENTCOST( usGridNo - WORLD_COLS + 1, NORTHEAST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo + 1, EAST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo + WORLD_COLS + 1, SOUTHEAST, 0, TRAVELCOST_OBSTACLE );
if (gubWorldMovementCosts[usGridNo + WORLD_COLS][SOUTH][0] < TRAVELCOST_BLOCKED)
 FORCE_SET_MOVEMENTCOST(usGridNo + WORLD_COLS, SOUTH, 0, TRAVELCOST_NONE);
SET_MOVEMENTCOST( usGridNo + WORLD_COLS - 1, SOUTHWEST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo - 1, WEST, 0, TRAVELCOST_OBSTACLE );
SET_MOVEMENTCOST( usGridNo - WORLD_COLS - 1, NORTHWEST, 0, TRAVELCOST_OBSTACLE );

Лечит подвисание AI при попытке перепрыгнуть в северном направлении забор, за которым расположен непроходимый объект.
Зарегистрирован

Сборки 1.13 | Ja2+AI | Youtube | VK
Страниц: 1     « Открыть сокрытое! » Послать Тему Послать Тему Печатать Печатать

« Предыдущая Тема | Следующая Тема »

Статистика. Размер данных: 57648 GZip: off
A.I.M. » Powered by YaBB Modification 4 (v.4.0.0-pre)!
YaBB © 2000-2003. All Rights Reserved.