@ -1616,16 +1616,18 @@ bool MonsterRangedSpecialAttack(int i)
assert ( monster . MData ! = nullptr ) ;
if ( monster . AnimInfo . CurrentFrame = = monster . MData - > mAFNum2 & & monster . AnimInfo . TickCounterOfCurrentFrame = = 0 ) {
AddMissile (
monster . position . tile ,
monster . enemyPosition ,
monster . _mdir ,
static_cast < missile_id > ( monster . _mVar1 ) ,
TARGET_PLAYERS ,
i ,
monster . _mVar3 ,
0 ) ;
PlayEffect ( monster , 3 ) ;
if ( AddMissile (
monster . position . tile ,
monster . enemyPosition ,
monster . _mdir ,
static_cast < missile_id > ( monster . _mVar1 ) ,
TARGET_PLAYERS ,
i ,
monster . _mVar3 ,
0 )
! = nullptr ) {
PlayEffect ( monster , 3 ) ;
}
}
if ( monster . _mAi = = AI_MEGA & & monster . AnimInfo . CurrentFrame = = monster . MData - > mAFNum2 ) {
@ -2556,11 +2558,12 @@ void RhinoAi(int i)
if ( dist > = 5
& & v < 2 * monster . _mint + 43
& & LineClear ( [ & monster ] ( Point position ) { return IsTileAvailable ( monster , position ) ; } , monster . position . tile , { fx , fy } ) ) {
AddMissile ( monster . position . tile , { fx , fy } , md , MIS_RHINO , TARGET_PLAYERS , i , 0 , 0 ) ;
if ( monster . MData - > snd_special )
PlayEffect ( monster , 3 ) ;
dMonster [ monster . position . tile . x ] [ monster . position . tile . y ] = - ( i + 1 ) ;
monster . _mmode = MonsterMode : : Charge ;
if ( AddMissile ( monster . position . tile , { fx , fy } , md , MIS_RHINO , TARGET_PLAYERS , i , 0 , 0 ) ! = nullptr ) {
if ( monster . MData - > snd_special )
PlayEffect ( monster , 3 ) ;
dMonster [ monster . position . tile . x ] [ monster . position . tile . y ] = - ( i + 1 ) ;
monster . _mmode = MonsterMode : : Charge ;
}
} else {
if ( dist > = 2 ) {
v = GenerateRnd ( 100 ) ;
@ -2758,9 +2761,10 @@ void BatAi(int i)
& & ( abs ( xd ) > = 5 | | abs ( yd ) > = 5 )
& & v < 4 * monster . _mint + 33
& & LineClear ( [ & monster ] ( Point position ) { return IsTileAvailable ( monster , position ) ; } , monster . position . tile , { fx , fy } ) ) {
AddMissile ( monster . position . tile , { fx , fy } , md , MIS_RHINO , TARGET_PLAYERS , i , 0 , 0 ) ;
dMonster [ monster . position . tile . x ] [ monster . position . tile . y ] = - ( i + 1 ) ;
monster . _mmode = MonsterMode : : Charge ;
if ( AddMissile ( monster . position . tile , { fx , fy } , md , MIS_RHINO , TARGET_PLAYERS , i , 0 , 0 ) ! = nullptr ) {
dMonster [ monster . position . tile . x ] [ monster . position . tile . y ] = - ( i + 1 ) ;
monster . _mmode = MonsterMode : : Charge ;
}
} else if ( abs ( xd ) > = 2 | | abs ( yd ) > = 2 ) {
if ( ( monster . _mVar2 > 20 & & v < monster . _mint + 13 )
| | ( IsAnyOf ( static_cast < MonsterMode > ( monster . _mVar1 ) , MonsterMode : : MoveNorthwards , MonsterMode : : MoveSouthwards , MonsterMode : : MoveSideways )
@ -3026,10 +3030,11 @@ void SnakeAi(int i)
monster . _mdir = md ;
if ( abs ( mx ) > = 2 | | abs ( my ) > = 2 ) {
if ( abs ( mx ) < 3 & & abs ( my ) < 3 & & LineClear ( [ & monster ] ( Point position ) { return IsTileAvailable ( monster , position ) ; } , monster . position . tile , { fx , fy } ) & & static_cast < MonsterMode > ( monster . _mVar1 ) ! = MonsterMode : : Charge ) {
AddMissile ( monster . position . tile , { fx , fy } , md , MIS_RHINO , TARGET_PLAYERS , i , 0 , 0 ) ;
PlayEffect ( monster , 0 ) ;
dMonster [ monster . position . tile . x ] [ monster . position . tile . y ] = - ( i + 1 ) ;
monster . _mmode = MonsterMode : : Charge ;
if ( AddMissile ( monster . position . tile , { fx , fy } , md , MIS_RHINO , TARGET_PLAYERS , i , 0 , 0 ) ! = nullptr ) {
PlayEffect ( monster , 0 ) ;
dMonster [ monster . position . tile . x ] [ monster . position . tile . y ] = - ( i + 1 ) ;
monster . _mmode = MonsterMode : : Charge ;
}
} else if ( static_cast < MonsterMode > ( monster . _mVar1 ) = = MonsterMode : : Delay | | GenerateRnd ( 100 ) > = 35 - 2 * monster . _mint ) {
if ( pattern [ monster . _mgoalvar1 ] = = - 1 )
md = Left ( md ) ;