Skip to content

Commit 4e6fee9

Browse files
revolucasXottab-DUTY
authored andcommitted
Stalkers will no longer stare at the floor or ceiling when in combat
Updated several combat actions with an "abs(y1-y2) > 3.0f" check for adjusting stalker sight direction to improve the look of indoor combat
1 parent 5ae2a72 commit 4e6fee9

File tree

1 file changed

+66
-35
lines changed

1 file changed

+66
-35
lines changed

src/xrGame/stalker_combat_actions.cpp

Lines changed: 66 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
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"
@@ -31,11 +31,11 @@
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

Comments
 (0)