Skip to content

Commit

Permalink
Merge branch 'master' into particle_cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
BMagnu authored Jan 19, 2025
2 parents 467bc32 + 1c82141 commit 5ce7881
Show file tree
Hide file tree
Showing 123 changed files with 1,956 additions and 990 deletions.
6 changes: 2 additions & 4 deletions code/actions/types/MoveToSubmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ ActionResult MoveToSubmodel::execute(ProgramLocals& locals) const
// The calling code should ensure that this never happens
Assertion(locals.hostSubobject >= 0, "Did not have a valid host subobject.");

auto instance = object_get_model_instance(locals.host.objp());
Assertion(instance != -1, "Model instances are required if a host subobject is specified.");

auto pmi = model_get_instance(instance);
auto pmi = object_get_model_instance(locals.host.objp());
Assertion(pmi != nullptr, "Model instances are required if a host subobject is specified.");
auto pm = model_get(pmi->model_num);

const auto destinationSubObject = m_subObjectExpression.execute(locals.variables);
Expand Down
6 changes: 2 additions & 4 deletions code/actions/types/ParticleEffectAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,8 @@ ActionResult ParticleEffectAction::execute(ProgramLocals& locals) const
vec3d local_pos;
matrix local_orient;
if (locals.hostSubobject != -1) {
auto instance = object_get_model_instance(locals.host.objp());
Assertion(instance != -1, "Model instances are required if a host subobject is specified.");

auto pmi = model_get_instance(instance);
auto pmi = object_get_model_instance(locals.host.objp());
Assertion(pmi != nullptr, "Model instances are required if a host subobject is specified.");
auto pm = model_get(pmi->model_num);

model_instance_local_to_global_point_orient(&local_pos,
Expand Down
6 changes: 2 additions & 4 deletions code/actions/types/PlaySoundAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ ActionResult PlaySoundAction::execute(ProgramLocals& locals) const
vec3d local_pos;
matrix local_orient;
if (locals.hostSubobject != -1) {
auto instance = object_get_model_instance(locals.host.objp());
Assertion(instance != -1, "Model instances are required if a host subobject is specified.");

auto pmi = model_get_instance(instance);
auto pmi = object_get_model_instance(locals.host.objp());
Assertion(pmi != nullptr, "Model instances are required if a host subobject is specified.");
auto pm = model_get(pmi->model_num);

model_instance_local_to_global_point_orient(&local_pos,
Expand Down
1 change: 1 addition & 0 deletions code/ai/ai.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ extern const int Num_ai_flag_names;
#define MAX_ENEMY_DISTANCE 2500.0f // Maximum distance from which a ship will pursue an enemy.

#define MAX_AI_GOALS 5
#define AI_ACTIVE_GOAL_NONE -1
#define AI_ACTIVE_GOAL_DYNAMIC 999

typedef struct ai_class {
Expand Down
3 changes: 2 additions & 1 deletion code/ai/ai_flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ namespace AI {
Dockee_index_valid, // when set, index field for dockee is valid
Goal_on_hold, // when set, this goal cannot currently be satisfied, although it could be in the future
Subsys_needs_fixup, // when set, the subsystem index (for a destroy subsystem goal) is invalid and must be gotten from the subsys name stored in docker.name field!!
Goal_override, // paired with AIG_TYPE_DYNAMIC to mean this goal overrides any other goal
Goal_override, // paired with ai_goal_type::DYNAMIC to mean this goal overrides any other goal
Purge, // purge this goal next time we process
Goals_purged, // this goal has already caused other goals to get purged
Depart_sound_played,// Goober5000 - replacement for AL's hack ;)
Expand Down Expand Up @@ -169,6 +169,7 @@ namespace AI {
Debris_respects_big_damage,
Dont_limit_change_in_speed_due_to_physics_whack,
Guards_ignore_protected_attackers,
Standard_strafe_used_more,

NUM_VALUES
};
Expand Down
22 changes: 20 additions & 2 deletions code/ai/ai_profiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ void parse_ai_profiles_tbl(const char *filename)
}

if (optional_string("$Detail Distance Multiplier:"))
parse_float_list(profile->detail_distance_mult, MAX_DETAIL_LEVEL + 1);
parse_float_list(profile->detail_distance_mult, MAX_DETAIL_VALUE + 1);

set_flag(profile, "$big ships can attack beam turrets on untargeted ships:", AI::Profile_Flags::Big_ships_can_attack_beam_turrets_on_untargeted_ships);

Expand Down Expand Up @@ -655,6 +655,20 @@ void parse_ai_profiles_tbl(const char *filename)

set_flag(profile, "$fix avoid-shockwave bugs:", AI::Profile_Flags::Fix_avoid_shockwave_bugs);

set_flag(profile, "$standard strafe used more:", AI::Profile_Flags::Standard_strafe_used_more);

if (optional_string("$standard strafe triggers under this speed:")) {
stuff_float(&profile->standard_strafe_when_below_speed);
}

if (optional_string("$strafe distance from target bounding box:")) {
stuff_float(&profile->strafe_retreat_box_dist);
}

if (optional_string("$strafe stops after time unhit:")) {
stuff_float(&profile->strafe_max_unhit_time);
}

// end of options ----------------------------------------

// if we've been through once already and are at the same place, force a move
Expand Down Expand Up @@ -747,6 +761,10 @@ void ai_profile_t::reset()
turret_target_recheck_time = 2000.0f;
rot_fac_multiplier_ply_collisions = 0.0f;

standard_strafe_when_below_speed = 3.0f;
strafe_retreat_box_dist = 300.0f;
strafe_max_unhit_time = 20.0f;

for (int i = 0; i < NUM_SKILL_LEVELS; ++i) {
max_incoming_asteroids[i] = 0;
max_allowed_player_homers[i] = 0;
Expand Down Expand Up @@ -804,7 +822,7 @@ void ai_profile_t::reset()
player_autoaim_fov[i] = 0;
}

for (int i = 0; i <= MAX_DETAIL_LEVEL; ++i) {
for (int i = 0; i <= MAX_DETAIL_VALUE; ++i) {
detail_distance_mult[i] = 0;
}

Expand Down
7 changes: 6 additions & 1 deletion code/ai/ai_profiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ class ai_profile_t {
// Player-specific autoaim FOV override
float player_autoaim_fov[NUM_SKILL_LEVELS];

float detail_distance_mult[MAX_DETAIL_LEVEL + 1]; //MAX_DETAIL_LEVEL really needs to be 4
float detail_distance_mult[MAX_DETAIL_VALUE + 1]; //MAX_DETAIL_VALUE really needs to be 4

// minimum radius for the line-of-sight (los) detection --wookieejedi
float los_min_detection_radius;
Expand All @@ -126,6 +126,11 @@ class ai_profile_t {
// Multiplier value so the player can also experience rotational effects from collisions --wookieejedi
float rot_fac_multiplier_ply_collisions;

// Strafing options --wookieejedi
float standard_strafe_when_below_speed; // Speed at which standard strafing large ships is possibly triggered
float strafe_retreat_box_dist; // Distance beyond the bounding box to retreat to strafing point
float strafe_max_unhit_time; // Maximum amount of time to stay in strafe mode if not hit

void reset();
};

Expand Down
42 changes: 21 additions & 21 deletions code/ai/aibig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,9 @@
#define MIN_DOT_TO_ATTACK_MOVING_SUBSYS 0.97f

// AI BIG MAGIC NUMBERS
// Select strafing options are now exposed to modders --wookieejedi
#define STRAFE_RETREAT_COLLIDE_TIME 2.0 // when anticipated collision time is less than this, begin retreat
#define STRAFE_RETREAT_COLLIDE_DIST 100 // when perpendicular distance to *surface* is less than this, begin retreat
#define STRAFE_RETREAT_BOX_DIST 300 // distance beyond the bounding box to retreat
#define STRAFE_MAX_UNHIT_TIME 20 // Maximum amount of time to stay in strafe mode if not hit

#define EVADE_BOX_BASE_DISTANCE 300 // standard distance to end evade submode
#define EVADE_BOX_MIN_DISTANCE 200 // minimun distance to end evade submode, after long time
Expand Down Expand Up @@ -719,19 +718,21 @@ void ai_big_chase_attack(ai_info *aip, ship_info *sip, vec3d *enemy_pos, float d
}
}
}

// Since ship is moving slowly and attacking a large ship, scan if enemy fighters are near, if so
// then enter strafe mode
if ( ai_big_maybe_start_strafe(aip, sip) ) {
aip->previous_mode = aip->mode;
aip->mode = AIM_STRAFE;
aip->submode_parm0 = Missiontime; // use parm0 as time strafe mode entered (i.e. MODE start time)
ai_big_strafe_position();
return;
}

} // end if ( Pl_objp->phys_info.speed < 3.0f )

// if moving slowly and attacking a large ship,
// check if need to enter standard strafe mode
// including ai_profile flag and if enemy fighters are near
if (Pl_objp->phys_info.speed < The_mission.ai_profile->standard_strafe_when_below_speed &&
(The_mission.ai_profile->flags[AI::Profile_Flags::Standard_strafe_used_more] || ai_big_maybe_start_strafe(aip, sip))) {
aip->previous_mode = aip->mode;
aip->mode = AIM_STRAFE;
aip->submode_parm0 = Missiontime; // use parm0 as time strafe mode entered (i.e. MODE start time)
ai_big_strafe_position();
return;
}

//Maybe enter glide strafe (check every 8 seconds, on a different schedule for each ship)
if ((sip->can_glide == true) && !(aip->ai_flags[AI::AI_Flags::Kamikaze]) && static_randf((Missiontime + static_rand(aip->shipnum)) >> 19) < aip->ai_glide_strafe_percent) {
aip->previous_mode = aip->mode;
Expand Down Expand Up @@ -913,13 +914,13 @@ static void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy)
}

if (tswp->num_secondary_banks > 0) {
if (!(En_objp->flags[Object::Object_Flags::Protected]) || (aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISABLE_SHIP_TACTICAL | AI_GOAL_DISARM_SHIP | AI_GOAL_DISARM_SHIP_TACTICAL))) {
if ( !(En_objp->flags[Object::Object_Flags::Protected]) || ai_goal_is_disable_or_disarm(aip->goals[0].ai_mode) ) {
bool valid_secondary = ai_choose_secondary_weapon(Pl_objp, aip, En_objp);
int current_bank = tswp->current_secondary_bank;
if (current_bank > -1 && valid_secondary) {
weapon_info *swip = &Weapon_info[tswp->secondary_bank_weapons[current_bank]];

if(!(En_objp->flags[Object::Object_Flags::Protected]) || ((aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISABLE_SHIP_TACTICAL | AI_GOAL_DISARM_SHIP | AI_GOAL_DISARM_SHIP_TACTICAL)) && swip->wi_flags[Weapon::Info_Flags::Puncture] )) { //override lockdown on protected ships when using anti subsystem weapons - Valathil
if ( !(En_objp->flags[Object::Object_Flags::Protected]) || (ai_goal_is_disable_or_disarm(aip->goals[0].ai_mode) && swip->wi_flags[Weapon::Info_Flags::Puncture]) ) { //override lockdown on protected ships when using anti subsystem weapons - Valathil
// If ship is protected and very low on hits, don't fire missiles.
if (!(En_objp->flags[Object::Object_Flags::Protected]) || (En_objp->hull_strength > 10*swip->damage)) {
if (aip->ai_flags[AI::AI_Flags::Unload_secondaries]) {
Expand Down Expand Up @@ -1439,21 +1440,21 @@ static int ai_big_strafe_maybe_retreat(const vec3d *target_pos)

//if ((dot_to_enemy > 1.0f - 0.1f * En_objp->radius/(dist_to_enemy + 1.0f)) && (Pl_objp->phys_info.speed > dist_to_enemy/5.0f))

// Inside 2 sec retreat, setting goal point to box point + 300m
// Inside 2 sec retreat, setting goal point to box point + strafe_retreat_box_dist
// If collision, use std collision resolution.
if ( !(aip->ai_flags[AI::AI_Flags::Kamikaze]) && ((aip->ai_flags[AI::AI_Flags::Target_collision]) || (time_to_target < STRAFE_RETREAT_COLLIDE_TIME) || (dist_normal_to_target < STRAFE_RETREAT_COLLIDE_DIST + speed_to_dist_penalty)) ) {
if (aip->ai_flags[AI::AI_Flags::Target_collision]) {
// use standard collision resolution
aip->ai_flags.remove(AI::AI_Flags::Target_collision);
big_ship_collide_recover_start(Pl_objp, En_objp, nullptr);
} else {
// too close for comfort so fly to box point + 300
// too close for comfort so fly to box point + strafe_retreat_box_dist
aip->submode = AIS_STRAFE_RETREAT1;
aip->submode_start_time = Missiontime;

int is_inside;
vec3d goal_point;
get_world_closest_box_point_with_delta(&goal_point, En_objp, &Pl_objp->pos, &is_inside, STRAFE_RETREAT_BOX_DIST);
get_world_closest_box_point_with_delta(&goal_point, En_objp, &Pl_objp->pos, &is_inside, The_mission.ai_profile->strafe_retreat_box_dist);

// set goal point
aip->goal_point = goal_point;
Expand Down Expand Up @@ -1568,8 +1569,7 @@ void ai_big_strafe_attack()
accelerate_ship(aip, accel);

// if haven't been hit in quite a while, leave strafe mode
fix long_enough;
long_enough = F1_0 * STRAFE_MAX_UNHIT_TIME;
fix long_enough = fl2f(The_mission.ai_profile->strafe_max_unhit_time);
if ( (last_hit > long_enough) && ( (Missiontime - aip->submode_parm0) > long_enough) ) {
ai_big_switch_to_chase_mode(aip);
}
Expand Down Expand Up @@ -1641,7 +1641,7 @@ void ai_big_strafe_glide_attack()
//Keep going until we are too far away.
//If we are still on approach but too far away, this will still trigger. This will allow us to reposition the target
//point and allow for a "jinking" effect.
if (target_ship_dist > (STRAFE_RETREAT_BOX_DIST + target_objp->radius) &&
if (target_ship_dist > (The_mission.ai_profile->strafe_retreat_box_dist + target_objp->radius) &&
Missiontime - aip->submode_start_time > i2f(GLIDE_STRAFE_MIN_TIME)) {
//This checks whether we are moving toward the target or away from it. If moving towards, we reset the stage so that we
//pick a new attack vector (jinking). If moving away, we're at the end of a run so do a full reset (possibly allowing a
Expand Down Expand Up @@ -1691,7 +1691,7 @@ void ai_big_strafe_glide_attack()

// if haven't been hit in quite a while, leave strafe mode
// (same as ai_big_strafe_attack)
fix long_enough = F1_0 * STRAFE_MAX_UNHIT_TIME;
fix long_enough = fl2f(The_mission.ai_profile->strafe_max_unhit_time);
if ( (Missiontime - aip->last_hit_time > long_enough) && ( (Missiontime - aip->submode_parm0) > long_enough) ) {
ai_big_switch_to_chase_mode(aip);
}
Expand Down
41 changes: 23 additions & 18 deletions code/ai/aicode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4605,7 +4605,7 @@ void ai_fly_to_target_position(const vec3d* target_pos, bool* pl_done_p=NULL, bo

/* I shouldn't be flying to position for what ever called me any more.
Set mode to none so that default dynamic behaviour gets started up again. */
if ( (aip->active_goal == AI_GOAL_NONE) || (aip->active_goal == AI_ACTIVE_GOAL_DYNAMIC) ) {
if ( (aip->active_goal == AI_ACTIVE_GOAL_NONE) || (aip->active_goal == AI_ACTIVE_GOAL_DYNAMIC) ) {
aip->mode = AIM_NONE;
}

Expand Down Expand Up @@ -4871,12 +4871,10 @@ void ai_fly_to_target_position(const vec3d* target_pos, bool* pl_done_p=NULL, bo
// for itself and in a wing, treat the completion as we would a ship
treat_as_ship = 1;
if ( shipp->wingnum != -1 ) {
int type;

// protect array access from invalid indexes
if ((aip->active_goal >= 0) && (aip->active_goal < MAX_AI_GOALS)) {
type = aip->goals[aip->active_goal].type;
if ( (type == AIG_TYPE_EVENT_WING) || (type == AIG_TYPE_PLAYER_WING) ) {
auto type = aip->goals[aip->active_goal].type;
if ( (type == ai_goal_type::EVENT_WING) || (type == ai_goal_type::PLAYER_WING) ) {
treat_as_ship = 0;
} else {
treat_as_ship = 1;
Expand Down Expand Up @@ -5058,7 +5056,7 @@ int maybe_resume_previous_mode(object *objp, ai_info *aip)
aip->mode = aip->previous_mode;
aip->submode = aip->previous_submode;
aip->submode_start_time = Missiontime;
aip->active_goal = AI_GOAL_NONE;
aip->active_goal = AI_ACTIVE_GOAL_NONE;
aip->mode_time = -1; // Means do forever.
return 1;
}
Expand All @@ -5079,7 +5077,7 @@ int maybe_resume_previous_mode(object *objp, ai_info *aip)
aip->mode = aip->previous_mode;
aip->submode = AIS_GUARD_PATROL;
aip->submode_start_time = Missiontime;
aip->active_goal = AI_GOAL_NONE;
aip->active_goal = AI_ACTIVE_GOAL_NONE;
return 1;
}
}
Expand Down Expand Up @@ -5739,7 +5737,7 @@ int ai_select_primary_weapon(object *objp, object *other_objp, Weapon::Info_Flag
Assert( shipp->ship_info_index >= 0 && shipp->ship_info_index < ship_info_size());

//made it so it only selects puncture weapons if the active goal is to disable something -Bobboau
if ((flags == Weapon::Info_Flags::Puncture) && (Ai_info[shipp->ai_index].goals[0].ai_mode & (AI_GOAL_DISARM_SHIP | AI_GOAL_DISARM_SHIP_TACTICAL | AI_GOAL_DISABLE_SHIP | AI_GOAL_DISABLE_SHIP_TACTICAL)))
if ((flags == Weapon::Info_Flags::Puncture) && ai_goal_is_disable_or_disarm(Ai_info[shipp->ai_index].goals[0].ai_mode))
{
if (swp->current_primary_bank >= 0)
{
Expand Down Expand Up @@ -5966,9 +5964,9 @@ void set_primary_weapon_linkage(object *objp)

// AL 2-11-98: If ship has a disarm or disable goal, don't link unless both weapons are
// puncture weapons
if ( (aip->active_goal != AI_GOAL_NONE) && (aip->active_goal != AI_ACTIVE_GOAL_DYNAMIC) )
if ( (aip->active_goal != AI_ACTIVE_GOAL_NONE) && (aip->active_goal != AI_ACTIVE_GOAL_DYNAMIC) )
{
if ( aip->goals[aip->active_goal].ai_mode & (AI_GOAL_DISABLE_SHIP|AI_GOAL_DISABLE_SHIP_TACTICAL|AI_GOAL_DISARM_SHIP|AI_GOAL_DISARM_SHIP_TACTICAL) )
if ( ai_goal_is_disable_or_disarm(aip->goals[aip->active_goal].ai_mode) )
{
// only continue if both primaries are puncture weapons
if ( swp->num_primary_banks == 2 ) {
Expand Down Expand Up @@ -8689,10 +8687,17 @@ void ai_cruiser_chase()

// kamikaze - ram and explode
if (aip->ai_flags[AI::AI_Flags::Kamikaze]) {
ai_turn_towards_vector(&En_objp->pos, Pl_objp, nullptr, nullptr, 0.0f, 0);
// point toward the subsystem if we're targeting one; otherwise point toward the center
if (aip->targeted_subsys) {
get_subsystem_pos(&goal_pos, En_objp, aip->targeted_subsys);
} else {
goal_pos = En_objp->pos;
}

ai_turn_towards_vector(&goal_pos, Pl_objp, nullptr, nullptr, 0.0f, 0);
accelerate_ship(aip, 1.0f);

float dot = vm_vec_dot_to_point(&Pl_objp->orient.vec.fvec, &Pl_objp->pos, &En_objp->pos);
float dot = vm_vec_dot_to_point(&Pl_objp->orient.vec.fvec, &Pl_objp->pos, &goal_pos);
if (ai_willing_to_afterburn_hard(aip) && dot > 0.99f)
ai_afterburn_hard(Pl_objp, aip);
}
Expand Down Expand Up @@ -14974,7 +14979,7 @@ int ai_need_new_target(object *pl_objp, int target_objnum)

// Goober5000 - targeting the same team is allowed if pl_objp is going bonkers
ai_info *pl_aip = &Ai_info[Ships[pl_objp->instance].ai_index];
if (pl_aip->active_goal != AI_GOAL_NONE && pl_aip->active_goal != AI_ACTIVE_GOAL_DYNAMIC) {
if (pl_aip->active_goal != AI_ACTIVE_GOAL_NONE && pl_aip->active_goal != AI_ACTIVE_GOAL_DYNAMIC) {
if (pl_aip->goals[pl_aip->active_goal].flags[AI::Goal_Flags::Target_own_team]) {
return 0;
}
Expand Down Expand Up @@ -15176,7 +15181,7 @@ void ai_frame(int objnum)
if ( ai_need_new_target(Pl_objp, target_objnum) ) {
if ((aip->mode != AIM_EVADE_WEAPON) && (aip->active_goal == AI_ACTIVE_GOAL_DYNAMIC)) {
aip->resume_goal_time = -1;
aip->active_goal = AI_GOAL_NONE;
aip->active_goal = AI_ACTIVE_GOAL_NONE;
} else if (aip->resume_goal_time == -1) {
// AL 12-9-97: Don't allow cargo and navbuoys to set their aip->target_objnum
if ( Ship_info[shipp->ship_info_index].class_type > -1 && (Ship_types[Ship_info[shipp->ship_info_index].class_type].flags[Ship::Type_Info_Flags::AI_auto_attacks]) ) {
Expand Down Expand Up @@ -15241,7 +15246,7 @@ void ai_frame(int objnum)

// If there is a goal to resume and enough time has elapsed, resume the goal.
if ((aip->resume_goal_time > 0) && (aip->resume_goal_time < Missiontime)) {
aip->active_goal = AI_GOAL_NONE;
aip->active_goal = AI_ACTIVE_GOAL_NONE;
aip->resume_goal_time = -1;
target_objnum = find_enemy(objnum, 2000.0f, The_mission.ai_profile->max_attackers[Game_skill_level]);
if (target_objnum != -1) {
Expand Down Expand Up @@ -15733,7 +15738,7 @@ void ai_do_default_behavior(object *obj)
// default behavior in most cases (especially if we're docked) is to just stay put
aip->mode = AIM_NONE;
aip->submode_start_time = Missiontime;
aip->active_goal = AI_GOAL_NONE;
aip->active_goal = AI_ACTIVE_GOAL_NONE;

// if we're not docked, we may modify the behavior a bit
if (!object_is_docked(obj))
Expand Down Expand Up @@ -16443,7 +16448,7 @@ void ai_ship_destroy(int shipnum)
set_target_objnum(other_aip, -1);
// If this ship had a dynamic goal of chasing the dead ship, clear the dynamic goal.
if (other_aip->resume_goal_time != -1)
other_aip->active_goal = AI_GOAL_NONE;
other_aip->active_goal = AI_ACTIVE_GOAL_NONE;
}

if (other_aip->goal_objnum == dead_shipp->objnum) {
Expand Down Expand Up @@ -16610,7 +16615,7 @@ void ai_add_rearm_goal( object *requester_objp, object *support_objp )
// ensures that the player get a higher priority!
requester_aip->ai_flags.set(AI::AI_Flags::Awaiting_repair); // Tell that I'm awaiting repair.
if ( requester_objp->flags[Object::Object_Flags::Player_ship] )
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_REARM_REPAIR, -1, requester_shipp->ship_name, support_aip );
ai_add_ship_goal_player( ai_goal_type::PLAYER_SHIP, AI_GOAL_REARM_REPAIR, -1, requester_shipp->ship_name, support_aip );
else
ai_add_goal_ship_internal( support_aip, AI_GOAL_REARM_REPAIR, requester_shipp->ship_name, -1, -1 );

Expand Down
Loading

0 comments on commit 5ce7881

Please sign in to comment.