Move awareness events to d_level_unique_robot_awareness_state
This commit is contained in:
parent
03214c0e6f
commit
ef0e64d421
|
@ -46,6 +46,22 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
||||||
|
|
||||||
namespace dcx {
|
namespace dcx {
|
||||||
struct point_seg;
|
struct point_seg;
|
||||||
|
|
||||||
|
struct awareness_event
|
||||||
|
{
|
||||||
|
segnum_t segnum; // segment the event occurred in
|
||||||
|
player_awareness_type_t type; // type of event, defines behavior
|
||||||
|
vms_vector pos; // absolute 3 space location of event
|
||||||
|
};
|
||||||
|
|
||||||
|
struct d_level_unique_robot_awareness_state
|
||||||
|
{
|
||||||
|
unsigned Num_awareness_events;
|
||||||
|
array<awareness_event, 64> Awareness_events;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern d_level_unique_robot_awareness_state LevelUniqueRobotAwarenessState;
|
||||||
|
|
||||||
}
|
}
|
||||||
struct PHYSFS_File;
|
struct PHYSFS_File;
|
||||||
|
|
||||||
|
@ -89,7 +105,7 @@ extern const object *Ai_last_missile_camera;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace dsx {
|
namespace dsx {
|
||||||
void create_awareness_event(vmobjptr_t objp, player_awareness_type_t type); // object *objp can create awareness of player, amount based on "type"
|
void create_awareness_event(vmobjptr_t objp, player_awareness_type_t type, d_level_unique_robot_awareness_state &LevelUniqueRobotAwarenessState); // object *objp can create awareness of player, amount based on "type"
|
||||||
ai_mode ai_behavior_to_mode(ai_behavior behavior);
|
ai_mode ai_behavior_to_mode(ai_behavior behavior);
|
||||||
void do_ai_robot_hit(vmobjptridx_t robot, player_awareness_type_t type);
|
void do_ai_robot_hit(vmobjptridx_t robot, player_awareness_type_t type);
|
||||||
void init_ai_object(vmobjptridx_t objp, ai_behavior initial_mode, imsegidx_t hide_segment);
|
void init_ai_object(vmobjptridx_t objp, ai_behavior initial_mode, imsegidx_t hide_segment);
|
||||||
|
|
|
@ -79,6 +79,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
||||||
#include "u_mem.h"
|
#include "u_mem.h"
|
||||||
//end addition -MM
|
//end addition -MM
|
||||||
|
|
||||||
|
#include "compiler-exchange.h"
|
||||||
#include "compiler-range_for.h"
|
#include "compiler-range_for.h"
|
||||||
#include "segiter.h"
|
#include "segiter.h"
|
||||||
#include "d_enumerate.h"
|
#include "d_enumerate.h"
|
||||||
|
@ -209,6 +210,8 @@ segnum_t Believed_player_seg;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace dcx {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct robot_to_player_visibility_state
|
struct robot_to_player_visibility_state
|
||||||
|
@ -218,16 +221,14 @@ struct robot_to_player_visibility_state
|
||||||
uint8_t initialized = 0;
|
uint8_t initialized = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr std::integral_constant<std::size_t, 64> MAX_AWARENESS_EVENTS{};
|
struct awareness_t : array<player_awareness_type_t, MAX_SEGMENTS>
|
||||||
struct awareness_event
|
|
||||||
{
|
{
|
||||||
segnum_t segnum; // segment the event occurred in
|
|
||||||
player_awareness_type_t type; // type of event, defines behavior
|
|
||||||
vms_vector pos; // absolute 3 space location of event
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static int ai_evaded;
|
static int ai_evaded;
|
||||||
|
|
||||||
// These globals are set by a call to find_vector_intersection, which is a slow routine,
|
// These globals are set by a call to find_vector_intersection, which is a slow routine,
|
||||||
|
@ -236,9 +237,6 @@ static vms_vector Hit_pos;
|
||||||
static int Hit_type;
|
static int Hit_type;
|
||||||
static fvi_info Hit_data;
|
static fvi_info Hit_data;
|
||||||
|
|
||||||
static unsigned Num_awareness_events;
|
|
||||||
static array<awareness_event, MAX_AWARENESS_EVENTS> Awareness_events;
|
|
||||||
|
|
||||||
namespace dcx {
|
namespace dcx {
|
||||||
vms_vector Believed_player_pos;
|
vms_vector Believed_player_pos;
|
||||||
|
|
||||||
|
@ -1209,7 +1207,7 @@ player_led: ;
|
||||||
multi_send_robot_fire(obj, obj->ctype.ai_info.CURRENT_GUN, fire_vec);
|
multi_send_robot_fire(obj, obj->ctype.ai_info.CURRENT_GUN, fire_vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
create_awareness_event(obj, player_awareness_type_t::PA_NEARBY_ROBOT_FIRED);
|
create_awareness_event(obj, player_awareness_type_t::PA_NEARBY_ROBOT_FIRED, LevelUniqueRobotAwarenessState);
|
||||||
|
|
||||||
set_next_fire_time(obj, ailp, robptr, gun_num);
|
set_next_fire_time(obj, ailp, robptr, gun_num);
|
||||||
|
|
||||||
|
@ -4349,7 +4347,7 @@ void init_ai_for_ship()
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Returns false if awareness is considered too puny to add, else returns true.
|
// Returns false if awareness is considered too puny to add, else returns true.
|
||||||
static int add_awareness_event(const object_base &objp, player_awareness_type_t type)
|
static int add_awareness_event(const object_base &objp, player_awareness_type_t type, d_level_unique_robot_awareness_state &awareness)
|
||||||
{
|
{
|
||||||
// If player cloaked and hit a robot, then increase awareness
|
// If player cloaked and hit a robot, then increase awareness
|
||||||
if (type == player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION ||
|
if (type == player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION ||
|
||||||
|
@ -4357,14 +4355,15 @@ static int add_awareness_event(const object_base &objp, player_awareness_type_t
|
||||||
type == player_awareness_type_t::PA_PLAYER_COLLISION)
|
type == player_awareness_type_t::PA_PLAYER_COLLISION)
|
||||||
ai_do_cloak_stuff();
|
ai_do_cloak_stuff();
|
||||||
|
|
||||||
if (Num_awareness_events < MAX_AWARENESS_EVENTS) {
|
if (awareness.Num_awareness_events < awareness.Awareness_events.size())
|
||||||
|
{
|
||||||
if (type == player_awareness_type_t::PA_WEAPON_WALL_COLLISION ||
|
if (type == player_awareness_type_t::PA_WEAPON_WALL_COLLISION ||
|
||||||
type == player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION)
|
type == player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION)
|
||||||
if (objp.type == OBJ_WEAPON && get_weapon_id(objp) == weapon_id_type::VULCAN_ID)
|
if (objp.type == OBJ_WEAPON && get_weapon_id(objp) == weapon_id_type::VULCAN_ID)
|
||||||
if (d_rand() > 3276)
|
if (d_rand() > 3276)
|
||||||
return 0; // For vulcan cannon, only about 1/10 actually cause awareness
|
return 0; // For vulcan cannon, only about 1/10 actually cause awareness
|
||||||
|
|
||||||
auto &e = Awareness_events[Num_awareness_events++];
|
auto &e = awareness.Awareness_events[awareness.Num_awareness_events++];
|
||||||
e.segnum = objp.segnum;
|
e.segnum = objp.segnum;
|
||||||
e.pos = objp.pos;
|
e.pos = objp.pos;
|
||||||
e.type = type;
|
e.type = type;
|
||||||
|
@ -4380,12 +4379,13 @@ static int add_awareness_event(const object_base &objp, player_awareness_type_t
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
// Robots will become aware of the player based on something that occurred.
|
// Robots will become aware of the player based on something that occurred.
|
||||||
// The object (probably player or weapon) which created the awareness is objp.
|
// The object (probably player or weapon) which created the awareness is objp.
|
||||||
void create_awareness_event(const vmobjptr_t objp, player_awareness_type_t type)
|
void create_awareness_event(const vmobjptr_t objp, player_awareness_type_t type, d_level_unique_robot_awareness_state &LevelUniqueRobotAwarenessState)
|
||||||
{
|
{
|
||||||
// If not in multiplayer, or in multiplayer with robots, do this, else unnecessary!
|
// If not in multiplayer, or in multiplayer with robots, do this, else unnecessary!
|
||||||
if (!(Game_mode & GM_MULTI) || (Game_mode & GM_MULTI_ROBOTS))
|
if (!(Game_mode & GM_MULTI) || (Game_mode & GM_MULTI_ROBOTS))
|
||||||
{
|
{
|
||||||
if (add_awareness_event(objp, type)) {
|
if (add_awareness_event(objp, type, LevelUniqueRobotAwarenessState))
|
||||||
|
{
|
||||||
if (((d_rand() * (static_cast<unsigned>(type) + 4)) >> 15) > 4)
|
if (((d_rand() * (static_cast<unsigned>(type) + 4)) >> 15) > 4)
|
||||||
Overall_agitation++;
|
Overall_agitation++;
|
||||||
if (Overall_agitation > OVERALL_AGITATION_MAX)
|
if (Overall_agitation > OVERALL_AGITATION_MAX)
|
||||||
|
@ -4394,14 +4394,6 @@ void create_awareness_event(const vmobjptr_t objp, player_awareness_type_t type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
struct awareness_t : array<player_awareness_type_t, MAX_SEGMENTS>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
static void pae_aux(const vcsegptridx_t segnum, const player_awareness_type_t type, const int level, awareness_t &New_awareness)
|
static void pae_aux(const vcsegptridx_t segnum, const player_awareness_type_t type, const int level, awareness_t &New_awareness)
|
||||||
{
|
{
|
||||||
|
@ -4427,24 +4419,23 @@ static void pae_aux(const vcsegptridx_t segnum, const player_awareness_type_t ty
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
static void process_awareness_events(fvcsegptridx &vcsegptridx, awareness_t &New_awareness)
|
static void process_awareness_events(fvcsegptridx &vcsegptridx, d_level_unique_robot_awareness_state &LevelUniqueRobotAwarenessState, awareness_t &New_awareness)
|
||||||
{
|
{
|
||||||
|
const auto Num_awareness_events = exchange(LevelUniqueRobotAwarenessState.Num_awareness_events, 0);
|
||||||
if (!(Game_mode & GM_MULTI) || (Game_mode & GM_MULTI_ROBOTS))
|
if (!(Game_mode & GM_MULTI) || (Game_mode & GM_MULTI_ROBOTS))
|
||||||
{
|
{
|
||||||
New_awareness.fill(player_awareness_type_t::PA_NONE);
|
New_awareness.fill(player_awareness_type_t::PA_NONE);
|
||||||
range_for (auto &i, partial_const_range(Awareness_events, Num_awareness_events))
|
range_for (auto &i, partial_const_range(LevelUniqueRobotAwarenessState.Awareness_events, Num_awareness_events))
|
||||||
pae_aux(vcsegptridx(i.segnum), i.type, 1, New_awareness);
|
pae_aux(vcsegptridx(i.segnum), i.type, 1, New_awareness);
|
||||||
}
|
}
|
||||||
|
|
||||||
Num_awareness_events = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
static void set_player_awareness_all(fvmobjptr &vmobjptr, fvcsegptridx &vcsegptridx)
|
static void set_player_awareness_all(fvmobjptr &vmobjptr, fvcsegptridx &vcsegptridx, d_level_unique_robot_awareness_state &LevelUniqueRobotAwarenessState)
|
||||||
{
|
{
|
||||||
awareness_t New_awareness;
|
awareness_t New_awareness;
|
||||||
|
|
||||||
process_awareness_events(vcsegptridx, New_awareness);
|
process_awareness_events(vcsegptridx, LevelUniqueRobotAwarenessState, New_awareness);
|
||||||
|
|
||||||
range_for (const auto &&objp, vmobjptr)
|
range_for (const auto &&objp, vmobjptr)
|
||||||
{
|
{
|
||||||
|
@ -4554,7 +4545,7 @@ void do_ai_frame_all(void)
|
||||||
dump_ai_objects_all();
|
dump_ai_objects_all();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
set_player_awareness_all(vmobjptr, vcsegptridx);
|
set_player_awareness_all(vmobjptr, vcsegptridx, LevelUniqueRobotAwarenessState);
|
||||||
|
|
||||||
#if defined(DXX_BUILD_DESCENT_II)
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
auto &BossUniqueState = LevelUniqueObjectState.BossState;
|
auto &BossUniqueState = LevelUniqueObjectState.BossState;
|
||||||
|
|
|
@ -403,7 +403,7 @@ static void collide_player_and_wall(const vmobjptridx_t playerobj, const fix hit
|
||||||
int volume;
|
int volume;
|
||||||
volume = (hitspeed-(WALL_DAMAGE_SCALE*WALL_DAMAGE_THRESHOLD)) / WALL_LOUDNESS_SCALE ;
|
volume = (hitspeed-(WALL_DAMAGE_SCALE*WALL_DAMAGE_THRESHOLD)) / WALL_LOUDNESS_SCALE ;
|
||||||
|
|
||||||
create_awareness_event(playerobj, player_awareness_type_t::PA_WEAPON_WALL_COLLISION);
|
create_awareness_event(playerobj, player_awareness_type_t::PA_WEAPON_WALL_COLLISION, LevelUniqueRobotAwarenessState);
|
||||||
|
|
||||||
if ( volume > F1_0 )
|
if ( volume > F1_0 )
|
||||||
volume = F1_0;
|
volume = F1_0;
|
||||||
|
@ -932,7 +932,7 @@ static window_event_result collide_weapon_and_wall(
|
||||||
if (( weapon->ctype.laser_info.parent_type== OBJ_PLAYER ) || robot_escort) {
|
if (( weapon->ctype.laser_info.parent_type== OBJ_PLAYER ) || robot_escort) {
|
||||||
|
|
||||||
if (!(weapon->flags & OF_SILENT) && (weapon->ctype.laser_info.parent_num == get_local_player().objnum))
|
if (!(weapon->flags & OF_SILENT) && (weapon->ctype.laser_info.parent_num == get_local_player().objnum))
|
||||||
create_awareness_event(weapon, player_awareness_type_t::PA_WEAPON_WALL_COLLISION); // object "weapon" can attract attention to player
|
create_awareness_event(weapon, player_awareness_type_t::PA_WEAPON_WALL_COLLISION, LevelUniqueRobotAwarenessState); // object "weapon" can attract attention to player
|
||||||
|
|
||||||
// We now allow flares to open doors.
|
// We now allow flares to open doors.
|
||||||
{
|
{
|
||||||
|
@ -1052,7 +1052,7 @@ static void collide_robot_and_player(const vmobjptridx_t robot, const vmobjptrid
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
create_awareness_event(playerobj, player_awareness_type_t::PA_PLAYER_COLLISION); // object robot can attract attention to player
|
create_awareness_event(playerobj, player_awareness_type_t::PA_PLAYER_COLLISION, LevelUniqueRobotAwarenessState); // object robot can attract attention to player
|
||||||
do_ai_robot_hit_attack(robot, playerobj, collision_point);
|
do_ai_robot_hit_attack(robot, playerobj, collision_point);
|
||||||
do_ai_robot_hit(robot, player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION);
|
do_ai_robot_hit(robot, player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION);
|
||||||
}
|
}
|
||||||
|
@ -1715,7 +1715,7 @@ static void collide_robot_and_weapon(const vmobjptridx_t robot, const vmobjptri
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (weapon->ctype.laser_info.parent_num == get_local_player().objnum) {
|
if (weapon->ctype.laser_info.parent_num == get_local_player().objnum) {
|
||||||
create_awareness_event(weapon, player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION); // object "weapon" can attract attention to player
|
create_awareness_event(weapon, player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION, LevelUniqueRobotAwarenessState); // object "weapon" can attract attention to player
|
||||||
do_ai_robot_hit(robot, player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION);
|
do_ai_robot_hit(robot, player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -2119,7 +2119,7 @@ bool FireLaser(player_info &player_info)
|
||||||
const auto cobjp = vmobjptridx(ConsoleObject);
|
const auto cobjp = vmobjptridx(ConsoleObject);
|
||||||
apply_damage_to_player(cobjp, cobjp, d_rand() * 4, 0);
|
apply_damage_to_player(cobjp, cobjp, d_rand() * 4, 0);
|
||||||
} else {
|
} else {
|
||||||
create_awareness_event(vmobjptr(ConsoleObject), player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION);
|
create_awareness_event(vmobjptr(ConsoleObject), player_awareness_type_t::PA_WEAPON_ROBOT_COLLISION, LevelUniqueRobotAwarenessState);
|
||||||
multi_digi_play_sample(SOUND_FUSION_WARMUP, F1_0);
|
multi_digi_play_sample(SOUND_FUSION_WARMUP, F1_0);
|
||||||
}
|
}
|
||||||
Fusion_next_sound_time = GameTime64 + F1_0/8 + d_rand()/4;
|
Fusion_next_sound_time = GameTime64 + F1_0/8 + d_rand()/4;
|
||||||
|
|
|
@ -1363,7 +1363,7 @@ static imobjptridx_t Laser_player_fire_spread_delay(fvmsegptridx &vmsegptridx, c
|
||||||
vms_vector *pnt;
|
vms_vector *pnt;
|
||||||
|
|
||||||
#if defined(DXX_BUILD_DESCENT_II)
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
create_awareness_event(obj, player_awareness_type_t::PA_WEAPON_WALL_COLLISION);
|
create_awareness_event(obj, player_awareness_type_t::PA_WEAPON_WALL_COLLISION, LevelUniqueRobotAwarenessState);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Find the initial position of the laser
|
// Find the initial position of the laser
|
||||||
|
|
|
@ -54,6 +54,7 @@ d_interface_unique_state InterfaceUniqueState;
|
||||||
d_level_shared_vertex_state LevelSharedVertexState;
|
d_level_shared_vertex_state LevelSharedVertexState;
|
||||||
d_level_unique_automap_state LevelUniqueAutomapState;
|
d_level_unique_automap_state LevelUniqueAutomapState;
|
||||||
d_level_unique_fuelcenter_state LevelUniqueFuelcenterState;
|
d_level_unique_fuelcenter_state LevelUniqueFuelcenterState;
|
||||||
|
d_level_unique_robot_awareness_state LevelUniqueRobotAwarenessState;
|
||||||
d_level_unique_segment_state LevelUniqueSegmentState;
|
d_level_unique_segment_state LevelUniqueSegmentState;
|
||||||
// Global array of vertices, common to one mine.
|
// Global array of vertices, common to one mine.
|
||||||
valptridx<player>::array_managed_type Players;
|
valptridx<player>::array_managed_type Players;
|
||||||
|
|
Loading…
Reference in a new issue