@ -55,7 +55,9 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str
enum PhaseName {
INITIALIZE ,
SPAWN_PILLAR_PREPARE ,
RESPAWN_PILLAR_PREPARE ,
SPAWN_PILLAR_CAST ,
RESPAWN_PILLAR_CAST ,
STANDARD ,
STONE_THROW_CAST ,
STONE_THROW_FINISH_ANIMATION ,
@ -114,7 +116,10 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str
m . F ( A : : RECOVERY_TIME ) = ConfigFloat ( " Beginning Phase.Pillar Cast Delay Time " ) ;
m . I ( A : : PATTERN_REPEAT_COUNT ) = ConfigInt ( " Beginning Phase.Repeat Count " ) ;
m . F ( A : : HEALTH_PCT_PHASE ) = 1.f ;
m . F ( A : : NEXT_HEALTH_PCT_PILLAR_PHASE ) = ConfigFloat ( " Pillar Respawns.Start HP Threshold " ) / 100.f ;
m . phase = SPAWN_PILLAR_PREPARE ;
if ( ConfigIntArr ( " Pillar Respawns.Respawn Count " , 0 ) < ConfigIntArr ( " Pillar Respawns.Respawn Count " , 1 ) ) ERR ( std : : format ( " WARNING! {} Stone golem pillars were declared damaged when only {} will spawn. Please make sure the number is the same or equal to the total spawned pillars! ( \" Pillar Respawns.Respawn Count \" strategy property) " , ConfigIntArr ( " Pillar Respawns.Respawn Count " , 1 ) , ConfigIntArr ( " Pillar Respawns.Respawn Count " , 0 ) ) ) ;
} break ;
case SPAWN_PILLAR_PREPARE : {
m . F ( A : : RECOVERY_TIME ) - = fElapsedTime ;
@ -127,6 +132,17 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str
m . phase = SPAWN_PILLAR_CAST ;
}
} break ;
case RESPAWN_PILLAR_PREPARE : {
m . F ( A : : RECOVERY_TIME ) - = fElapsedTime ;
if ( m . F ( A : : RECOVERY_TIME ) < = 0.f ) {
m . V ( A : : LOCKON_POS ) = game - > GetPlayer ( ) - > GetPos ( ) ;
m . SIZET ( A : : LOOPING_SOUND_ID ) = SoundEffect : : PlayLoopingSFX ( " Rock Toss Cast " , m . GetPos ( ) ) ;
m . PerformAnimation ( " CAST " , m . GetFacingDirectionToTarget ( m . V ( A : : LOCKON_POS ) ) ) ;
game - > AddEffect ( std : : make_unique < SpellCircle > ( m . V ( A : : LOCKON_POS ) , ConfigFloat ( " Pillar Respawns.Cast Time " ) , " range_indicator.png " , " spell_insignia.png " , m . OnUpperLevel ( ) , vf2d { 1.f , 1.f } * ( MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetCollisionRadius ( ) * MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetSizeMult ( ) / 12.f ) * 1.25f , 0.3f , vf2d { } , ConfigPixel ( " Pillar Respawns.Spell Circle Color " ) , util : : random ( 2 * PI ) , util : : degToRad ( ConfigFloat ( " Pillar Respawns.Spell Circle Rotation Spd " ) ) , false , vf2d { 1.f , 1.f } * ( MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetCollisionRadius ( ) * MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetSizeMult ( ) / 12.f ) * 0.9f , 0.3f , vf2d { } , ConfigPixel ( " Pillar Respawns.Spell Insignia Color " ) , util : : random ( 2 * PI ) , util : : degToRad ( ConfigFloat ( " Pillar Respawns.Spell Insignia Rotation Spd " ) ) ) , true ) ;
m . F ( A : : CASTING_TIMER ) = ConfigFloat ( " Pillar Respawns.Cast Time " ) ;
m . phase = RESPAWN_PILLAR_CAST ;
}
} break ;
case SPAWN_PILLAR_CAST : {
m . F ( A : : CASTING_TIMER ) - = fElapsedTime ;
if ( m . F ( A : : CASTING_TIMER ) < = 0.f ) {
@ -144,18 +160,49 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str
}
}
} break ;
case RESPAWN_PILLAR_CAST : {
m . F ( A : : CASTING_TIMER ) - = fElapsedTime ;
if ( m . F ( A : : CASTING_TIMER ) < = 0.f ) {
SoundEffect : : StopLoopingSFX ( m . SIZET ( A : : LOOPING_SOUND_ID ) ) ;
SoundEffect : : PlaySFX ( " Pillar Rise " , m . V ( A : : LOCKON_POS ) ) ;
if ( m . I ( A : : BAD_PILLAR_SPAWN_COUNT ) > 0 & &
( util : : random_range ( 0 , 1 ) < 0.5f | | m . I ( A : : PATTERN_REPEAT_COUNT ) < = m . I ( A : : BAD_PILLAR_SPAWN_COUNT ) ) ) {
Monster & badPillar { game - > SpawnMonster ( m . V ( A : : LOCKON_POS ) , MONSTER_DATA . at ( " Breaking Stone Golem Pillar " ) , m . OnUpperLevel ( ) ) } ;
badPillar . _DealTrueDamage ( badPillar . GetMaxHealth ( ) - 1U ) ; //Force the health to be 1.
m . I ( A : : BAD_PILLAR_SPAWN_COUNT ) - - ;
} else game - > SpawnMonster ( m . V ( A : : LOCKON_POS ) , MONSTER_DATA . at ( " Stone Golem Pillar " ) , m . OnUpperLevel ( ) ) ;
m . I ( A : : PATTERN_REPEAT_COUNT ) - - ;
game - > Hurt ( m . V ( A : : LOCKON_POS ) , MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetCollisionRadius ( ) * MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetSizeMult ( ) , MONSTER_DATA . at ( " Stone Golem Pillar " ) . GetAttack ( ) , m . OnUpperLevel ( ) , 0.f , HurtType : : PLAYER ) ;
if ( m . I ( A : : PATTERN_REPEAT_COUNT ) < = 0 ) {
m . phase = STANDARD ;
} else {
m . PerformIdleAnimation ( m . GetFacingDirectionToTarget ( game - > GetPlayer ( ) - > GetPos ( ) ) ) ;
m . F ( A : : RECOVERY_TIME ) = ConfigFloat ( " Pillar Respawns.Cast Delay Time " ) ;
m . phase = RESPAWN_PILLAR_PREPARE ;
}
}
} break ;
case STANDARD : {
BEAR ( m , fElapsedTime , " Bear " ) ;
//Extending the bear script's variables to read the state of it...
const bool SlamHasFinished = m . I ( A : : ATTACK_COUNT ) ! = m . I ( A : : BEAR_STOMP_COUNT ) ;
if ( SlamHasFinished ) {
if ( m . F ( A : : HEALTH_PCT_PHASE ) - m . GetHealthRatio ( ) > = 0.1f ) {
m . F ( A : : HEALTH_PCT_PHASE ) - = 0.1f ;
if ( m . F ( A : : HEALTH_PCT_PHASE ) - m . GetHealthRatio ( ) > = ConfigFloat ( " Shockwave.Repeating Threshold " ) / 10 0.f) {
m . F ( A : : HEALTH_PCT_PHASE ) - = ConfigFloat ( " Shockwave.Repeating Threshold " ) / 10 0.f;
m . F ( A : : CASTING_TIMER ) = ConfigFloat ( " Shockwave.Cast Time " ) ;
PrepareSafeAreas ( ) ;
m . phase = SHOCKWAVE ;
break ;
}
if ( m . F ( A : : NEXT_HEALTH_PCT_PILLAR_PHASE ) > = m . GetHealthRatio ( ) ) {
m . F ( A : : NEXT_HEALTH_PCT_PILLAR_PHASE ) - = ConfigFloat ( " Pillar Respawns.Repeating Threshold " ) / 100.f ;
m . F ( A : : RECOVERY_TIME ) = ConfigFloat ( " Pillar Respawns.Cast Delay Time " ) ;
m . I ( A : : PATTERN_REPEAT_COUNT ) = ConfigIntArr ( " Pillar Respawns.Respawn Count " , 0 ) ;
m . I ( A : : BAD_PILLAR_SPAWN_COUNT ) = ConfigIntArr ( " Pillar Respawns.Respawn Count " , 1 ) ;
m . phase = RESPAWN_PILLAR_PREPARE ;
break ;
}
const bool StoneThrowRollSucceeds = util : : random ( 100.f ) < = ConfigFloat ( " Standard Attack.Stone Throw Chance " ) ;
m . I ( A : : ATTACK_COUNT ) = m . I ( A : : BEAR_STOMP_COUNT ) ; //Make sure the slams are now reset if necessary.