Skip to content

Commit

Permalink
Updated several combat actions
Browse files Browse the repository at this point in the history
Adjusting stalker sight direction to improve the look of indoor combat; they will no longer stare at the floor or ceiling
  • Loading branch information
OldSerpskiStalker authored and Drombeys committed Apr 30, 2024
1 parent 929e1c7 commit 70665a9
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 42 deletions.
2 changes: 1 addition & 1 deletion src/xrGame/stalker_animation_callbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ static void _BCL callback_rotation (CBoneInstance* bone)
}
else
{
Msg("ERROR: stalker_animation_callbacks.cpp | callback_rotation | _valid(*parameter->m_rotation) failed for %s", object->Name());
Msg("! ERROR: stalker_animation_callbacks.cpp | callback_rotation | _valid(*parameter->m_rotation) failed for %s", object->Name());
}

CWeaponShotEffector& effector = object->weapon_shot_effector();
Expand Down
113 changes: 72 additions & 41 deletions src/xrGame/stalker_combat_actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -470,61 +470,71 @@ void CStalkerActionTakeCover::finalize ()
inherited::finalize ();
}

void CStalkerActionTakeCover::execute ()
void CStalkerActionTakeCover::execute()
{
#ifdef TEST_MENTAL_STATE
VERIFY ((start_level_time() == Device.dwTimeGlobal) || (object().movement().mental_state() == eMentalStateDanger));
VERIFY((start_level_time() == Device.dwTimeGlobal) || (object().movement().mental_state() == eMentalStateDanger));
#endif // TEST_MENTAL_STATE

inherited::execute ();
inherited::execute();

if (!object().memory().enemy().selected())
const CEntityAlive* enemy = object().memory().enemy().selected();

if (!enemy)
return;

CMemoryInfo mem_object = object().memory().memory(object().memory().enemy().selected());
CMemoryInfo mem_object = object().memory().memory(enemy);

if (!mem_object.m_object)
return;

if (object().movement().detail().distance_to_target() > CLOSE_MOVE_DISTANCE)
object().movement().set_body_state (eBodyStateStand);
object().movement().set_body_state(eBodyStateStand);
else
object().movement().set_movement_type (m_movement_type);
object().movement().set_movement_type(m_movement_type);

Fvector position = mem_object.m_object_params.m_position;
const CCoverPoint* point = object().best_cover(position);

Fvector position = mem_object.m_object_params.m_position;
const CCoverPoint *point = object().best_cover(position);
if (point) {
setup_cover (*point);
setup_cover(*point);

if (object().movement().path_completed() && object().Position().distance_to(point->position()) < 1.f)
object().brain().affect_cover (true);
object().brain().affect_cover(true);
else
object().brain().affect_cover (false);
object().brain().affect_cover(false);
}
else {
object().movement().set_nearest_accessible_position ();
object().brain().affect_cover (true);
object().movement().set_nearest_accessible_position();
object().brain().affect_cover(true);
}

//. Add fire here
// if (object().memory().visual().visible_now(object().memory().enemy().selected()) && object().can_kill_enemy())
// if (object().memory().visual().visible_now(object().memory().enemy().selected()))
if (fire_make_sense()) {
fire ();
}
else {
aim_ready ();
if (object().movement().path_completed())
{
object().best_cover_can_try_advance();
m_storage->set_property(eWorldPropertyInCover, true);
}

if (object().movement().path_completed()) {// && (object().memory().enemy().selected()->Position().distance_to_sqr(object().Position()) >= 10.f))
object().best_cover_can_try_advance ();
m_storage->set_property (eWorldPropertyInCover,true);
//Fix CAIStalker shooting at walls or aiming at ceiling or floor during this action
u32 last_time_seen = object().memory().visual().visible_object_time_last_seen(enemy);
if (last_time_seen != u32(-1) && Device.dwTimeGlobal - last_time_seen <= 2000 && fire_make_sense()) {
fire();
}
else
{
aim_ready();
}

if (object().memory().visual().visible_now(object().memory().enemy().selected()))
object().sight().setup (CSightAction(object().memory().enemy().selected(),true,true));
else
object().sight().setup (CSightAction(SightManager::eSightTypePosition,mem_object.m_object_params.m_position,true));
if (object().memory().visual().visible_now(enemy))
object().sight().setup(CSightAction(object().memory().enemy().selected(), true, true));
else
{

if (_abs(object().Position().y - enemy->Position().y) > 3.f)
object().sight().setup(CSightAction(SightManager::eSightTypePathDirection));
else
object().sight().setup(CSightAction(SightManager::eSightTypePosition, mem_object.m_object_params.m_position, true));
}
}

//////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -609,7 +619,12 @@ void CStalkerActionLookOut::execute ()
if (!mem_object.m_object)
return;

object().sight().setup (CSightAction(SightManager::eSightTypePosition,mem_object.m_object_params.m_position,true));
//Prevent stalkers from staring at ceiling or floor for this action
if (_abs(object().Position().y - mem_object.m_object_params.m_position.y) > 3.f)
object().sight().setup(CSightAction(SightManager::eSightTypePathDirection));
else
object().sight().setup(CSightAction(SightManager::eSightTypePosition, mem_object.m_object_params.m_position, true));
//-

if (current_cover(m_object) >= 3.f) {
object().movement().set_nearest_accessible_position ();
Expand Down Expand Up @@ -696,7 +711,12 @@ void CStalkerActionHoldPosition::execute ()
if (current_cover(m_object) < 3.f)
m_storage->set_property (eWorldPropertyLookedOut,false);

object().sight().setup (CSightAction(SightManager::eSightTypePosition,mem_object.m_object_params.m_position,true));
//Prevent stalkers from staring at floor or ceiling for this action
if (_abs(object().Position().y - mem_object.m_object_params.m_position.y) > 3.f)
object().sight().setup(CSightAction(SightManager::eSightTypePathDirection));
else
object().sight().setup(CSightAction(SightManager::eSightTypePosition, mem_object.m_object_params.m_position, true));
//-

if (completed()) {
if (
Expand Down Expand Up @@ -816,7 +836,12 @@ void CStalkerActionDetourEnemy::execute ()
m_storage->set_property (eWorldPropertyEnemyDetoured,true);
}

object().sight().setup (CSightAction(SightManager::eSightTypePosition,mem_object.m_object_params.m_position,true));
//Prevent stalkers from looking at ceiling or floor during action
if (_abs(object().Position().y - mem_object.m_object_params.m_position.y) >= 3.f)
object().sight().setup(CSightAction(SightManager::eSightTypePathDirection));
else
object().sight().setup(CSightAction(SightManager::eSightTypePosition, mem_object.m_object_params.m_position, true));
//-
}

//////////////////////////////////////////////////////////////////////////
Expand All @@ -835,7 +860,7 @@ void CStalkerActionPostCombatWait::initialize ()
if (object().movement().current_params().cover())
return;

object().movement().set_movement_type (eMovementTypeStand);
object().movement().set_movement_type (eMovementTypeRun);

EObjectAction action = eObjectActionAimReady1;
if (m_storage->property(eWorldPropertyKilledWounded))
Expand Down Expand Up @@ -994,19 +1019,25 @@ void CStalkerActionSuddenAttack::execute ()
//if (object().agent_manager().member().combat_members().size() > 1)
// m_storage->set_property (eWorldPropertyUseSuddenness,false);

if (!object().memory().enemy().selected())
const CEntityAlive* enemy = object().memory().enemy().selected();

if (!enemy)
return;

CMemoryInfo mem_object = object().memory().memory(object().memory().enemy().selected());
CMemoryInfo mem_object = object().memory().memory(enemy);

if (!mem_object.m_object)
return;

bool visible_now = object().memory().visual().visible_now(object().memory().enemy().selected());
bool visible_now = object().memory().visual().visible_now(enemy);
if (visible_now)
object().sight().setup (CSightAction(object().memory().enemy().selected(),true));
else
object().sight().setup (CSightAction(SightManager::eSightTypePosition,mem_object.m_object_params.m_position,true));
object().sight().setup(CSightAction(enemy, true));
else {
if (_abs(object().Position().y - enemy->Position().y) >= 3.f)
object().sight().setup(CSightAction(SightManager::eSightTypePathDirection));
else
object().sight().setup(CSightAction(SightManager::eSightTypePosition, mem_object.m_object_params.m_position, true));
}

if (object().movement().accessible(mem_object.m_object_params.m_level_vertex_id))
object().movement().set_level_dest_vertex (mem_object.m_object_params.m_level_vertex_id);
Expand Down Expand Up @@ -1051,9 +1082,9 @@ void CStalkerActionSuddenAttack::execute ()
}
}

CVisualMemoryManager *visual_memory_manager = object().memory().enemy().selected()->visual_memory();
CVisualMemoryManager* visual_memory_manager = enemy->visual_memory();
VERIFY (visual_memory_manager);
if (object().memory().enemy().selected()->g_Alive() && !visual_memory_manager->visible_now(&object()))
if (enemy->g_Alive() && !visual_memory_manager->visible_now(&object()))
return;

m_storage->set_property (eWorldPropertyUseSuddenness, false);
Expand Down

0 comments on commit 70665a9

Please sign in to comment.