88
99#include " pch_script.h"
1010#include " stalker_combat_actions.h"
11- #include " ai/stalker /ai_stalker.h"
11+ #include " Ai/Stalker /ai_stalker.h"
1212#include " script_game_object.h"
1313#include " script_game_object_impl.h"
1414#include " stalker_decision_space.h"
15- #include " inventory .h"
15+ #include " Inventory .h"
1616#include " cover_evaluators.h"
1717#include " cover_point.h"
1818#include " cover_manager.h"
19- #include " missile .h"
19+ #include " Missile .h"
2020#include " stalker_movement_restriction.h"
2121#include " movement_manager_space.h"
2222#include " detail_path_manager_space.h"
3131#include " agent_member_manager.h"
3232#include " agent_location_manager.h"
3333#include " danger_cover_location.h"
34- #include " ai/stalker /ai_stalker_space.h"
35- #include " weapon .h"
34+ #include " Ai/Stalker /ai_stalker_space.h"
35+ #include " Weapon .h"
3636#include " danger_manager.h"
3737#include " detail_path_manager.h"
38- #include " weaponmagazined .h"
38+ #include " WeaponMagazined .h"
3939#include " stalker_animation_manager.h"
4040#include " hit_memory_manager.h"
4141#include " level_path_manager.h"
@@ -504,10 +504,12 @@ void CStalkerActionTakeCover::execute()
504504
505505 inherited::execute ();
506506
507- if (!object ().memory ().enemy ().selected ())
507+ const CEntityAlive* enemy = object ().memory ().enemy ().selected ();
508+
509+ if (!enemy)
508510 return ;
509511
510- CMemoryInfo mem_object = object ().memory ().memory (object (). memory (). enemy (). selected () );
512+ CMemoryInfo mem_object = object ().memory ().memory (enemy);
511513
512514 if (!mem_object.m_object )
513515 return ;
@@ -537,26 +539,34 @@ void CStalkerActionTakeCover::execute()
537539 // . Add fire here
538540 // if (object().memory().visual().visible_now(object().memory().enemy().selected()) && object().can_kill_enemy())
539541 // if (object().memory().visual().visible_now(object().memory().enemy().selected()))
540- if (fire_make_sense ())
541- {
542- fire ();
543- }
544- else
545- {
546- aim_ready ();
547- }
548542
549543 if (object ().movement ().path_completed ())
550- { // && (object().memory().enemy().selected()->Position().distance_to_sqr(object().Position()) >= 10.f))
544+ {// && (object().memory().enemy().selected()->Position().distance_to_sqr(object().Position()) >= 10.f))
551545 object ().best_cover_can_try_advance ();
552546 m_storage->set_property (eWorldPropertyInCover, true );
553547 }
554548
555- if (object ().memory ().visual ().visible_now (object ().memory ().enemy ().selected ()))
549+ // Alundaio: Fix CAIStalker shooting at walls or aiming at ceiling or floor during this action
550+ u32 last_time_seen = object ().memory ().visual ().visible_object_time_last_seen (enemy);
551+ if (last_time_seen != u32 (-1 ) && Device.dwTimeGlobal - last_time_seen <= 2000 && fire_make_sense ())
552+ {
553+ fire ();
554+ }
555+ else
556+ aim_ready ();
557+
558+ if (object ().memory ().visual ().visible_now (enemy))
559+ {
556560 object ().sight ().setup (CSightAction (object ().memory ().enemy ().selected (), true , true ));
561+ }
557562 else
558- object ().sight ().setup (
559- CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
563+ {
564+ if (_abs (object ().Position ().y - enemy->Position ().y ) > 3 .f )
565+ object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
566+ else
567+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
568+ }
569+ // -Alundaio
560570}
561571
562572// ////////////////////////////////////////////////////////////////////////
@@ -631,8 +641,12 @@ void CStalkerActionLookOut::execute()
631641
632642 if (!mem_object.m_object )
633643 return ;
634-
635- object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
644+ // Alundaio: Prevent stalkers from staring at ceiling or floor for this action
645+ if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
646+ object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
647+ else
648+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
649+ // -Alundaio
636650
637651 if (current_cover (m_object) >= 3 .f )
638652 {
@@ -723,7 +737,12 @@ void CStalkerActionHoldPosition::execute()
723737 if (current_cover (m_object) < 3 .f )
724738 m_storage->set_property (eWorldPropertyLookedOut, false );
725739
726- object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
740+ // Alundaio: Prevent stalkers from staring at floor or ceiling for this action
741+ if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
742+ object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
743+ else
744+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
745+ // -Alundaio
727746
728747 if (completed ())
729748 {
@@ -850,7 +869,12 @@ void CStalkerActionDetourEnemy::execute()
850869 m_storage->set_property (eWorldPropertyEnemyDetoured, true );
851870 }
852871
853- object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
872+ // Alundaio: Prevent stalkers from looking at ceiling or floor during action
873+ if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) >= 3 .f )
874+ object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
875+ else
876+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
877+ // -Alundaio
854878}
855879
856880// ////////////////////////////////////////////////////////////////////////
@@ -869,8 +893,7 @@ void CStalkerActionPostCombatWait::initialize()
869893 if (object ().movement ().current_params ().cover ())
870894 return ;
871895
872- object ().movement ().set_movement_type (eMovementTypeStand);
873-
896+ object ().movement ().set_movement_type (eMovementTypeRun); // Alundaio. Was eMovementTypeStand
874897 EObjectAction action = eObjectActionAimReady1;
875898 if (m_storage->property (eWorldPropertyKilledWounded))
876899 action = eObjectActionIdle;
@@ -1024,22 +1047,30 @@ void CStalkerActionSuddenAttack::execute()
10241047 // Alundaio: Removed check to allow stalkers to sneak up on enemy even if they are in a group.
10251048 // if (object().agent_manager().member().combat_members().size() > 1)
10261049 // m_storage->set_property(eWorldPropertyUseSuddenness, false);
1027- // Alundaio: END
1050+ // - Alundaio
10281051
1029- if (!object ().memory ().enemy ().selected ())
1052+ const CEntityAlive* enemy = object ().memory ().enemy ().selected ();
1053+ if (!enemy)
10301054 return ;
10311055
1032- CMemoryInfo mem_object = object ().memory ().memory (object (). memory (). enemy (). selected () );
1056+ CMemoryInfo mem_object = object ().memory ().memory (enemy);
10331057
10341058 if (!mem_object.m_object )
10351059 return ;
10361060
1037- bool visible_now = object ().memory ().visual ().visible_now (object ().memory ().enemy ().selected ());
1061+ // Alundaio: Don't aim at ceiling or floor
1062+ bool visible_now = object ().memory ().visual ().visible_now (enemy);
1063+
10381064 if (visible_now)
1039- object ().sight ().setup (CSightAction (object (). memory (). enemy (). selected () , true ));
1065+ object ().sight ().setup (CSightAction (enemy, true ));
10401066 else
1041- object ().sight ().setup (
1042- CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
1067+ {
1068+ if (_abs (object ().Position ().y - enemy->Position ().y ) >= 3 .f )
1069+ object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
1070+ else
1071+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
1072+ }
1073+ // -Alundaio
10431074
10441075 if (object ().movement ().accessible (mem_object.m_object_params .m_level_vertex_id ))
10451076 object ().movement ().set_level_dest_vertex (mem_object.m_object_params .m_level_vertex_id );
@@ -1096,9 +1127,9 @@ void CStalkerActionSuddenAttack::execute()
10961127 }
10971128 }
10981129
1099- CVisualMemoryManager* visual_memory_manager = object (). memory (). enemy (). selected () ->visual_memory ();
1130+ CVisualMemoryManager* visual_memory_manager = enemy->visual_memory ();
11001131 VERIFY (visual_memory_manager);
1101- if (object (). memory (). enemy (). selected () ->g_Alive () && !visual_memory_manager->visible_now (&object ()))
1132+ if (enemy->g_Alive () && !visual_memory_manager->visible_now (&object ()))
11021133 return ;
11031134
11041135 m_storage->set_property (eWorldPropertyUseSuddenness, false );
0 commit comments