Files
firestorm/Gameleap/mw4/Content/AI/AI.constants
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

477 lines
23 KiB
Plaintext

[Mood Entropy]
// This is how much we add or subtract to our current mood every 2 seconds if
// our current mood is different from our entropy mood
entropy_regeneration_at_0 = 0.1; // entropy regeneration every 2 seconds at elite level 0
entropy_regeneration_at_100 = 0.4; // entropy regeneration every 2 seconds at elite level 100
// NOTE: entropy_regeneration_at_100 *MUST* be greater than entropy_regeneration_at_0
[Friendly Fire Building Cheat]
building_ff_multiplier = 0.1; // when a friendly fire shot hits a building, this multiplier is applied to the damage the building takes
// (note: this should be very small so that friendly fire has a hard time destroying a base accidentally)
[Mood Modifiers]
// These are modifiers for the current mood when various events occur.
// NOTE: previously, these were multipliers; now, they are what is ADDED to the mood when the
// event occurs (usually a negative number to indicate that the mood has lowered).
shutdown = -0.5; // when we are about to be forced to shut down due to overheating
internal_armor_breached = -0.8; // when internal armor is damaged
fall_down = -2.5; // when we fall down
first_arm_hit = -2.0; // when our first arm is blown off
second_arm_hit = -4.0; // when both arms are now blown off
first_leg_hit = -2.5; // when one of our legs is taken out (gimped)
mood_squad_dead_unit_multiplier = 3.5; // when a unit dies, we subtract this number divided by the number of living units left in the group from all who remain
// i.e. in a 4-unit group, we subtract N/3 when the first unit dies, N/2 when the second unit dies, N when the third unit dies
// (of course, we don't care when the 4th unit dies, because by then the group is no more!)
interval_multiplier_desperate = 1.4; // multiplier for the attack interval when we're in a "desperate" mood
interval_multiplier_defensive = 1.1; // multiplier for the attack interval when we're in a "defensive" mood
interval_multiplier_neutral = 1.0; // multiplier for the attack interval when we're in a "neutral" mood
interval_multiplier_aggressive = 0.85; // multiplier for the attack interval when we're in an "aggressive" mood
interval_multiplier_brutal = 0.7; // multiplier for the attack interval when we're in a "brutal" mood
[Missed Shot Modifiers]
// These are modifiers used when we're about to fire a shot that we want to miss.
// The "skew_size" numbers indicate the maximum amount to randomly offset a point from the component we're trying
// to miss. Larger numbers mean shots should veer off further from the body part we're pretending to try to hit.
// WARNING: DO NOT SET THE SKEW SIZE BELOW 1.0!
// The "skew_increment" numbers indicate, for any given attempt to miss, the multiplier that we temporarily apply to the skew size.
// I.e. 1.2 indicates "We missed? OK, exaggerate the skew size by 20% and roll a new point. We missed again? OK, repeat."
// WARNING: DO NOT SET THE SKEW INCREMENT BELOW 1.2! Also, a larger skew size should be paired with a smaller skew increment and vice versa.
skew_at_0 = 7.0; // skew size at base (unmodified) chance-to_hit of 0%; should be less than skew_at_100
skew_at_100 = 1.5; // skew size at base (unmodified) chance-to_hit of 100%; should be greater than skew_at_0
skew_inc_at_0 = 1.3; // skew increment at base (unmodified) chance-to_hit of 0%
// NOTE: should be smaller than skew_inc_at_100 since the skew_at_0 is already a large number
skew_inc_at_100 = 1.5; // skew increment at base (unmodified) chance-to_hit of 100%
// NOTE: this should be higher than the skew_inc_at_0 to ensure that we can actually
// miss in a reasonable number of retries!
[Speed Definitions]
// This section defines "speeds" that will be used in a later section of this file.
// Each defines a maximum speed value for that level, in KPH.
speed_stopped = 5; // stopped, or very slow: 0 to N KPH
speed_slow = 20; // moving slowly
speed_medium = 50; // moving at a moderate clip
speed_fast = 80; // moving at a fast speed
speed_maximum = 1000; // moving very fast
[Tonnage Definitions]
// This section defines mech sizes in terms of tonnage that will be used in a later section of this file.
// Each size defines a maximum tonnage value for that level.
mech_tiny = 1; // tiny mech: 0 to N tons
mech_small = 35; // small mech
mech_medium = 55; // medium-size mech
mech_large = 75; // large mech
mech_huge = 200; // huge mech
[Distance Definitions]
// This section defines mech distances in terms of meters that will be used in a later section of this file.
// Each value defines a maximum distance value for that level.
distance_adjacent = 25; // target is very close: 0 to N meters
distance_near = 70; // target is not far
distance_medium = 200; // target is medium range
distance_far = 600; // target is kinda far away
distance_very_far = 2000; // target is near the edge of my perception
[To-Hit Modifiers]
// These are multipliers to the to-hit percentage roll for various attributes of the target.
if_crouched = 0.8; // if the target is crouched
if_tiny = 0.8;
if_small = 0.85;
if_medium_size = 0.9;
if_large = 0.95;
if_huge = 1.0;
if_stopped = 1.0;
if_slow = 0.95; \
if_medium_speed = 0.9;
if_fast = 0.8;
if_maximum = 0.65;
if_shooter_stopped = 1.0;
if_shooter_slow = 0.95;
if_shooter_medium = 0.90;
if_shooter_fast = 0.80;
if_shooter_maximum = 0.65;
if_adjacent = 1.0;
if_near = 0.95;
if_medium_range = 0.85;
if_far = 0.75;
if_very_far = 0.55;
if_firing_with_one_arm = 0.5;
if_turning = 0.97; // the multiplier to be used when the target is turning at the maximum rate (intermediate
// turning values will be smoothly interpolated between this number and 1)
// "if_bearing_90" is used as follows:
// -if the target is stopped or slow, the value is used
// -if the target is medium or fast, the value is squared, then used
// -if the target is maximum, the value is cubed, then used
if_bearing_90 = 0.95; // the multiplier to use when the target is sideways relative to us
// (we interpolate between this number and 1.0, with 1.0 used when target is
// facing toward or away from us)
[Elite Levels]
// These are the minimum and maximum elite levels (inclusive) required in order for a vehicle to perform a specific action.
// These are specified as percentage values, from 0 to 100. The "min" value must ALWAYS be less than or equal to
// (probably *much* less than) the max value. If min > max, the action cannot be carried out!
// If a unit's current elite level is less than the minimum or greater than the maximum, it will not perform the action.
// A "min" value of 0 and a "max" value of 100 indicates that the elite level is irrelevant to carrying out the specified task.
// The "min_tactic_*" numbers are the minimum and maximum elite levels to carry out a given tactic.
min_evade_when_missiles_shot_at_me = 65; // whether or not I will attempt to evade missiles shot directly at me
max_evade_when_missiles_shot_at_me = 100;
min_evade_when_targeted = 10; // whether or not I will avoid allowing myself to remain within the player's targeting reticule
max_evade_when_targeted = 100; // for more than a half-second or so (i.e. I try to avoid even letting him target me)
min_evade_by_jumping = 70; // whether or not I can jump as an evasive maneuver
max_evade_by_jumping = 100;
min_evade_by_throttle_override = 60; // whether or not I can override my attack throttle (i.e. increase my speed back up to full speed)
max_evade_by_throttle_override = 100; // as an evasive maneuver
min_evade_by_crouching = 75; // whether or not I can crouch as an evasive maneuver (considered for use only if I'm standing still)
max_evade_by_crouching = 100;
min_jump_if_rushed = 55; // whether or not I can jump if I think I'm about to collide with the player
max_jump_if_rushed = 100; // (NOTE: this is specifically for enemy AI units against the player; AI units will not use this on each other!)
min_opportunity_fire = 10; // whether or not I can fire at other potential targets when I
max_opportunity_fire = 100; // can't shoot my current target target (for whatever reason -- torso twisted wrong way, etc.)
min_look_left_or_right = 50; // whether or not a mech can look left/right out of the cockpit and shoot with only that arm
max_look_left_or_right = 100;
min_look_time_at_0 = 2; // minimum time a unit must be looking from left or right arm before it can fire (at elite level 0)
min_look_time_at_100 = 0; // minimum time a unit must be looking from left or right arm before it can fire (at elite level 100)
switch_to_random_component_picking = 65; // the point at which I switch from picking the least damaged
// component on my enemy to picking a random component to hit
switch_to_most_damaged_component_picking = 91; // the point at which I switch from picking a random component
// on my enemy to picking the most damaged
min_prefer_water = 0; // whether or not I should prefer to use water when executing an offensive tactic (i.e. not "retreat")
max_prefer_water = 100;
min_dont_use_limited_ammo_vs_non_mechs = 1; // whether I can use limited-ammo weapons against non-mech targets (assuming I have lasers)
max_dont_use_limited_ammo_vs_non_mechs = 100;
min_vulnerable_leg_hiding = 70; // whether or not I can take a single damaged/destroyed leg into account when maneuvering or turning in combat
max_vulnerable_leg_hiding = 100;
min_mood_vulnerable_leg_hiding = 2; // same as above, but based on mood
max_mood_vulnerable_leg_hiding = 7;
min_throttle_override = 10; // minimum elite skill required for certain tactics (such as Retreat) to override my current attack throttle setting
torso_twist_multiplier_at_0 = 0.65; // this specifies a multiplier that will be used at elite level 0; the AI will interpolate between this value and the value specified below
torso_twist_use_full_multiplier = 45; // specifies an elite skill to use 100% torso twist speed; less than this value, we interpolate according to the number above; greater or equal to this value, we use 100%
// MUST BE GREATER THAN 0!
[Evasion Characteristics]
jump_wait_time_at_0 = 30; // minimum time (in seconds) a mech at elite level 0 must wait between jumps
jump_wait_time_at_100 = 8; // minimum time (in seconds) a mech at elite level 100 must wait between jumps
evade_focus_time_at_0 = 3; // minimum time (in seconds) the player must be focused on a mech for it to decide to evade, at elite level 0
evade_focus_time_at_100 = 0.8; // minimum time (in seconds) the player must be focused on a mech for it to decide to evade, at elite level 100
[Lancemates]
lancemate_can_attack_radius = 450; // radius at which a lancemate searches for enemies to attack automatically
max_lancemate_distance_from_leader = 300; // the maximum distance a lancemate can go from its leader
[Tactics]
max_defend_distance_from_target = 120; // maximum distance anyone using the "defend" tactic can go from its target
jump_and_shoot_hover_height_min = 45; // minimum of how far off the ground a mech using the "jump and shoot" tactic will attempt to hover in midair
jump_and_shoot_hover_height_max = 100; // maximum of how far off the ground a mech using the "jump and shoot" tactic will attempt to hover in midair
[Firing]
max_fire_cheat_angle = 25; // maximum angle (in degrees) by which we can "cheat" when we fire
max_airplane_fire_cheat_angle = 50; // maximum cheat angle for air units
max_turret_fire_cheat_angle = 8; // maximum angle for laser turrets
[Tactic Selection]
// This section lists constants for automatic tactic selection/switching -- i.e. what tactics to select when you use OrderAttack()
min_tactic_time = 10; // minimum amount of time (in seconds) that we try any given tactic before switching to another tactic
// Joust
min_elite_joust = 0; // min elite level to select "Joust" tactic
max_elite_joust = 100; // max elite level to select "Joust" tactic
min_mood_joust = 6; // min mood to select "Joust" tactic
max_mood_joust = 8; // max mood to select "Joust" tactic
// Rush
min_elite_rush = 0; // min elite level to select "Rush" tactic
max_elite_rush = 100; // max elite level to select "Rush" tactic
min_mood_rush = 7; // min mood to select "Rush" tactic
max_mood_rush = 10; // max mood to select "Rush" tactic
// Hit + Run
min_elite_hitandrun = 0; // min elite level to select "Hit + Run" tactic
max_elite_hitandrun = 100; // max elite level to select "Hit + Run" tactic
min_mood_hitandrun = 5; // min mood to select "Hit + Run" tactic
max_mood_hitandrun = 7; // max mood to select "Hit + Run" tactic
// Rear
min_elite_rear = 0; // min elite level to select "Rear" tactic
max_elite_rear = 100; // max elite level to select "Rear" tactic
min_mood_rear = 3; // min mood to select "Rear" tactic
max_mood_rear = 10; // max mood to select "Rear" tactic
// Circle
min_elite_circle = 0; // min elite level to select "Circle of Death" tactic
max_elite_circle = 100; // max elite level to select "Circle of Death" tactic
min_mood_circle = 3; // min mood to select "Circle of Death" tactic
max_mood_circle = 8; // max mood to select "Circle of Death" tactic
// Retreat
min_elite_retreat = 0; // min elite level to select "Retreat" tactic
max_elite_retreat = 100; // max elite level to select "Retreat" tactic
min_mood_retreat = 0; // min mood to select "Retreat" tactic
max_mood_retreat = 2; // max mood to select "Retreat" tactic
// Death From Above
min_elite_dfa = 70; // min elite level to select "Death From Above" tactic
max_elite_dfa = 100; // max elite level to select "Death From Above" tactic
min_mood_dfa = 7; // min mood to select "Death From Above" tactic
max_mood_dfa = 10; // max mood to select "Death From Above" tactic
[AI Slope]
leg_up_slope = 0.707f; //cos (45 deg) slope order for best manuverablity
leg_down_slope = 0.5f; //cos (60 deg) must be leg, track, wheel, hover
track_up_slope = 0.766f; //cos (40 deg)
track_down_slope = 0.707f; //cos (45 deg)
wheel_up_slope = 0.819f; //cos (35 deg)
wheel_down_slope = 0.819f; //cos (35 deg)
hover_up_slope = 0.866f; //cos (30 deg)
hover_down_slope = 0.866f; //cos (30 deg)
[AI Movement Costs]
leg_dirt_cost = 0; // this is cost added to base cost of 1 to enter cell
leg_rock_cost = 0; // negative would be easier to enter
leg_steel_cost = 0; // positive would be harder
leg_blacktop_cost = 0; // use a number less than -100 for impassable
leg_glass_cost = 0;
leg_brick_cost = 0;
leg_grass_cost = 0;
leg_wood_cost = 0;
leg_tree_cost = 0;
leg_swamp_cost = 0;
leg_concrete_cost = 0;
leg_rough_cost = 0;
leg_snow_cost = 0;
leg_underbrush_cost = 0;
leg_shallowwater_cost = 0;
leg_midwater_cost = 0;
leg_oceanicwater_cost = 0;
leg_desert_cost = 0;
leg_flatswamp_cost = 0;
leg_thickswamp_cost = 0;
// leg_crackedlava_cost = 0.5;
// leg_openlava_cost = 0.75;
leg_crackedlava_cost = -150.0;
leg_openlava_cost = -150.0;
track_dirt_cost = 0;
track_rock_cost = 0;
track_steel_cost = 0;
track_blacktop_cost = 0;
track_glass_cost = 0;
track_brick_cost = 0;
track_grass_cost = 0;
track_wood_cost = 0;
track_tree_cost = 0;
track_swamp_cost = 0;
track_concrete_cost = 0;
track_rough_cost = 0;
track_snow_cost = 0;
track_underbrush_cost = 0;
track_shallowwater_cost = 0;
track_midwater_cost = 0;
track_oceanicwater_cost = 0;
track_desert_cost = 0;
track_flatswamp_cost = 0;
track_thickswamp_cost = 0;
track_crackedlava_cost = -150;
track_openlava_cost = -150;
wheel_dirt_cost = 0;
wheel_rock_cost = 0;
wheel_steel_cost = 0;
wheel_blacktop_cost = 0;
wheel_glass_cost = 0;
wheel_brick_cost = 0;
wheel_grass_cost = 0;
wheel_wood_cost = 0;
wheel_tree_cost = 0;
wheel_swamp_cost = 0;
wheel_concrete_cost = 0;
wheel_rough_cost = 0;
wheel_snow_cost = 0;
wheel_underbrush_cost = 0;
wheel_shallowwater_cost = 0;
wheel_midwater_cost = 0;
wheel_oceanicwater_cost = 0;
wheel_desert_cost = 0;
wheel_flatswamp_cost = 0;
wheel_thickswamp_cost = 0;
wheel_crackedlava_cost = -150;
wheel_openlava_cost = -150;
hover_dirt_cost = 0;
hover_rock_cost = 0;
hover_steel_cost = 0;
hover_blacktop_cost = 0;
hover_glass_cost = 0;
hover_brick_cost = 0;
hover_grass_cost = 0;
hover_wood_cost = 0;
hover_tree_cost = 0;
hover_swamp_cost = 0;
hover_concrete_cost = 0;
hover_rough_cost = 0;
hover_snow_cost = 0;
hover_underbrush_cost = 0;
hover_shallowwater_cost = 0;
hover_midwater_cost = 0;
hover_oceanicwater_cost = 0;
hover_desert_cost = 0;
hover_flatswamp_cost = 0;
hover_thickswamp_cost = 0;
hover_crackedlava_cost = -150;
hover_openlava_cost = -150;
[Objective]
objective_display_time = 30; // in seconds.
[Joystick]
throttle_center = 0.3 // 0-1
throttle_dead_low = 0.25 // on either side of throttle_center
throttle_dead_high = 0.06 // on either side of throttle_center
[Skills]
default_pilot = 20;
default_gunnery = 50;
default_elite = 30;
// default_minheat = 50;
// default_maxheat = 80;
default_minheat = 10;
default_maxheat = 35;
default_sensor = 2; // max time (in seconds) sensor data can be refreshed
default_blind = 80; // default multiplier (%) used for night and heavy fog missions if not specified
default_longrange = 100; // default additional multiplier (%) applied for long-range shots if not specified
default_shortrange = 100; // default additional multiplier (%) applied for short-range shots if not specified
default_addpilot = 10;
default_addgunnery = 1;
default_addelite = 10;
max_skill_add = 5; // max value a skill can increase per game
max_fog_dist_to_use_blind_skill = 400; // in a non-night mission, we use blind fighting skill if fog is <= this distance
[Piloting] // modifiers for piloting rolls
damage_amount = 1.1; // this amount is multiplied by tonage of the mech to get the damage to cause a skill check
fall_damage_minus = 40; // points of damage to subtract every second
fall_splash_multiplier = 0.115;
min_fall_timer = 10.0; // was 30.0
damage_mod = 0.8;
low_water_mod = 0.9;
mid_water_mod = 0.8;
concrete_mod = 0.9;
gimped_mod = 0.5;
double_damage_mod = 0.75;
moving_fast_mod = 0.75; // over 50% of max speed
jump_recover_mod = 0.75;
max_water_jump = 1; // maximum depth of water allowed for jumping
flying_turn_rate = 0.3; // turn rate to use while jump-jetting in radians per second (0.2 equals about 10 degrees)
// flying_turn_rate = 0.2; // turn rate to use while jump-jetting in radians per second (0.2 equals about 10 degrees)
[Ejecting] // modifiers for when pilots eject
eject_chance_for_non_lancemate = 25; // chance that a non-lancemate will eject
eject_chance_for_lancemate = 60; // chance that a lancemate will eject when destroyed
eject_chance_ok_when_ejected = 40; // chance that a lancemate will have "OK" status when he ejects
eject_chance_injured_when_ejected = 30; // chance that a lancemate will have "injured" status when he ejects
// NOTE: the chance to be "MIA" when ejected is 100 minus the sum of the chances to be OK or injured when ejected
[Difficulty] // modifier for difficulty levels
friend_easy_gunnery_mod = 1.3;
friend_medium_gunnery_mod = 1.1;
friend_hard_gunnery_mod = 1.0;
friend_impossible_gunnery_mod = 1.0;
enemy_easy_gunnery_mod = 0.35;
enemy_medium_gunnery_mod = 0.6;
enemy_hard_gunnery_mod = 1.00;
enemy_impossible_gunnery_mod = 2.0;
neutral_easy_gunnery_mod = 1.0;
neutral_medium_gunnery_mod = 1.0;
neutral_hard_gunnery_mod = 1.0;
neutral_impossible_gunnery_mod = 1.0;
[Collision] // modifiers for collision system
collision_mech_light_damage = 0.010 // was 0.003 points of damage done per ton per mps of impact
collision_mech_light_slowdown = 8.0 // was 8.0 mps of speed lost by a mech hitting a small building
collision_mech_light_mech_speed = 123.456 // was 123.456 square of minimum damaging impact speed in mps from mechs
collision_mech_light_building_speed = 25.0 // was 25.0 square of minimum damaging impact speed in mps to large buildings
collision_mech_medium_tonage = 20.0 // was 40 tons required for mech to be considered medium weight (now light/medium)
collision_mech_medium_damage = 0.010 // was 0.003 points of damage done per ton per mps of impact
collision_mech_medium_slowdown = 6.0 // was 7.0 mps of speed lost by a mech hitting a small building
collision_mech_medium_mech_speed = 123.456 // was 123.456 square of minimum damaging impact speed in mps from mechs
collision_mech_medium_building_speed = 25.0 // was 25.0 square of minimum damaging impact speed in mps to large buildings
collision_mech_heavy_tonage = 65.0 // was 75 tons required for mech to be considered heavy weight (now med/heavy/assault)
collision_mech_heavy_damage = 0.010 // was 0.003 points of damage done per ton per mps of impact
collision_mech_heavy_slowdown = 1.0 // was 6.0 mps of speed lost by a mech hitting a small building
collision_mech_heavy_mech_speed = 123.456 // was 123.456 square of minimum damaging impact speed in mps from mechs
collision_mech_heavy_building_speed = 25.0 // was 25.0 square of minimum damaging impact speed in mps to large buildings
collision_dfa_speed = 19.6 // (was 19.6) minimum downward impact speed in mps to use DFA constant
collision_dfa_damage_given = 0.050 // (was 0.016)points of damage done to target per ton per mps of dfa impact
collision_dfa_damage_taken = 0.01 // (was 0.006)points of damage done to landing mech per ton per mps of dfa impact
collision_tank_slowdown = 8.0 // mps of speed lost by a tank when hitting a small building or tree
[Salvage]
chance_salvage = 4 // chance for a destroyed mech to be added to salvage
[Mouse]
mouse_min_change = 0.015 // minimum the mouse must move to return to center
mouse_interia_mult = 0.02 // amount mouse delta is multiplied by, delta is in screen coordinates
mouse_max_mouse = 0.75 // maximum the mouse is allowed to be away from center 0-1 range