Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions objects/obj_controller/Create_0.gml
Original file line number Diff line number Diff line change
Expand Up @@ -808,18 +808,18 @@ bat_formation = array_create(_count, "");
bat_formation_type = array_create(_count, 0);
bat_deva_for = array_create(_count, 1);
bat_assa_for = array_create(_count, 4);
bat_tact_for = array_create(_count, 2);
bat_tact_for = array_create(_count, 3);
bat_vete_for = array_create(_count, 2);
bat_hire_for = array_create(_count, 3);
bat_libr_for = array_create(_count, 3);
bat_comm_for = array_create(_count, 3);
bat_tech_for = array_create(_count, 3);
bat_term_for = array_create(_count, 3);
bat_hono_for = array_create(_count, 3);
bat_hire_for = array_create(_count, 2);
bat_libr_for = array_create(_count, 2);
bat_comm_for = array_create(_count, 2);
bat_tech_for = array_create(_count, 2);
bat_term_for = array_create(_count, 4);
bat_hono_for = array_create(_count, 2);
bat_drea_for = array_create(_count, 5);
bat_rhin_for = array_create(_count, 6);
bat_pred_for = array_create(_count, 7);
bat_landraid_for = array_create(_count, 7);
bat_rhin_for = array_create(_count, 5);
bat_pred_for = array_create(_count, 5);
bat_landraid_for = array_create(_count, 5);
bat_landspee_for = array_create(_count, 4);
bat_whirl_for = array_create(_count, 1);
bat_scou_for = array_create(_count, 1);
Expand Down
22 changes: 8 additions & 14 deletions objects/obj_enunit/Alarm_0.gml
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ if (!engaged) {
var x2 = enemy.x;

repeat (instance_number(obj_pnunit) - 1) {
x2 += !flank ? 10 : -10;
x2 += !flank ? -10 : 10;
enemy2 = instance_nearest(x2, y, obj_pnunit);
if (!target_block_is_valid(enemy2, obj_pnunit)) {
continue;
Expand All @@ -150,21 +150,15 @@ if (!engaged) {
}

var _back_column_size_value = enemy2.column_size;
if (_back_column_size_value < _column_size_value) {
continue;

if (!check_column_obstruction(_column_size_value, _back_column_size_value)) {
obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.TARGETING, $"non-AP -> infantry found in back column {obj_ncombat.combat_debugger.resolve_label(enemy2)}, firing");
scr_shoot(i, enemy2, target_unit_index, "att", "ranged");
_shot = true;
break;
} else {
// Calculate chance of shots passing through to back row
// Higher ratio of back column size to front column size increases pass-through chance
// Maximum chance capped at 40% to ensure some protection remains
var _pass_chance = ((_back_column_size_value / _column_size_value) - 1) * 100;
if (irandom_range(1, 100) < min(_pass_chance, 80)) {
continue;
}
continue;
}
obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.TARGETING, $"non-AP -> infantry found in back column {obj_ncombat.combat_debugger.resolve_label(enemy2)}, firing");
scr_shoot(i, enemy2, target_unit_index, "att", "ranged");
_shot = true;
break;
}
}

Expand Down
6 changes: 6 additions & 0 deletions objects/obj_pnunit/Alarm_0.gml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ try {
}
}

// Speed Force sweeps the whole field - bypass normal targeting/range.
if (wep[i] == "Speed Force" || wep[i] == "Speed Force (Ranged)") {
scr_shoot_spread(i);
continue;
}

var _is_ap = apa[i] > 2;
var _dist = point_distance(x, y, enemy.x, enemy.y) / 10;
var _mode = engaged ? "melee" : "ranged";
Expand Down
53 changes: 8 additions & 45 deletions scripts/scr_clean/scr_clean.gml
Original file line number Diff line number Diff line change
Expand Up @@ -196,26 +196,7 @@ function scr_clean(target_object, target_is_infantry, hostile_shots, hostile_dam
}

/// @self Asset.GMObject.obj_pnunit
function damage_infantry(_damage_data, _shots, _damage, _hostile_armour_pierce) {
var _armour_mod = 0;
switch (_hostile_armour_pierce) {
case 4:
_armour_mod = 0;
break;
case 3:
_armour_mod = 1.5;
break;
case 2:
_armour_mod = 2;
break;
case 1:
_armour_mod = 3;
break;
default:
_armour_mod = 3;
break;
}

function damage_infantry(_damage_data, _shots, _damage, _armour_pierce) {
// Find valid infantry targets
var valid_marines = [];
for (var m = 0, l = array_length(unit_struct); m < l; m++) {
Expand All @@ -225,7 +206,7 @@ function damage_infantry(_damage_data, _shots, _damage, _hostile_armour_pierce)
}
}

obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.DAMAGE, $"damage_infantry valid_marines={array_length(valid_marines)} shots={_shots} dmg={_damage} ap={_hostile_armour_pierce}");
obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.DAMAGE, $"damage_infantry valid_marines={array_length(valid_marines)} shots={_shots} dmg={_damage} ap={_armour_pierce}");

// Apply damage for each shot
for (var shot = 0; shot < _shots; shot++) {
Expand All @@ -243,7 +224,7 @@ function damage_infantry(_damage_data, _shots, _damage, _hostile_armour_pierce)
// Apply damage
var _shot_luck = roll_dice_chapter(1, 100, "low");
var _modified_damage = 0;
var _marine_armour = marine_ac[marine_index] * _armour_mod;
var _marine_armour = combat_rank_armour(marine_ac[marine_index], _armour_pierce, false);
if (_shot_luck == 1) {
_modified_damage = _damage - (2 * _marine_armour);
} else if (_shot_luck == 100) {
Expand Down Expand Up @@ -305,26 +286,7 @@ function damage_infantry(_damage_data, _shots, _damage, _hostile_armour_pierce)
}

/// @self Asset.GMObject.obj_pnunit
function damage_vehicles(_damage_data, _shots, _damage, _hostile_armour_pierce) {
var _armour_mod = 0;
switch (_hostile_armour_pierce) {
case 4:
_armour_mod = 0;
break;
case 3:
_armour_mod = 2;
break;
case 2:
_armour_mod = 4;
break;
case 1:
_armour_mod = 6;
break;
default:
_armour_mod = 6;
break;
}

function damage_vehicles(_damage_data, _shots, _damage, _armour_pierce) {
var veh_index = -1;

// Find valid vehicle targets
Expand All @@ -335,7 +297,7 @@ function damage_vehicles(_damage_data, _shots, _damage, _hostile_armour_pierce)
}
}

obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.DAMAGE, $"damage_vehicles valid_vehicles={array_length(valid_vehicles)} shots={_shots} dmg={_damage} ap={_hostile_armour_pierce}");
obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.DAMAGE, $"damage_vehicles valid_vehicles={array_length(valid_vehicles)} shots={_shots} dmg={_damage} ap={_armour_pierce}");

// Apply damage for each hostile shot, until we run out of targets
for (var shot = 0; shot < _shots; shot++) {
Expand All @@ -349,7 +311,8 @@ function damage_vehicles(_damage_data, _shots, _damage, _hostile_armour_pierce)
veh_index = array_random_element(valid_vehicles);

// Apply damage
var _modified_damage = _damage - veh_ac[veh_index] * _armour_mod;
var _veh_armour = combat_rank_armour(veh_ac[veh_index], _armour_pierce, false);
var _modified_damage = _damage - _veh_armour;
if (_modified_damage < 0) {
_modified_damage = 0;
}
Expand All @@ -365,7 +328,7 @@ function damage_vehicles(_damage_data, _shots, _damage, _hostile_armour_pierce)
veh_dead[veh_index] = 1;
_damage_data.units_lost++;
obj_ncombat.player_forces -= 1;
obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.DAMAGE, $"damage_vehicles veh[{veh_index}] ({_damage_data.unit_type}) DESTROYED: armour={veh_ac[veh_index] * _armour_mod} raw_dmg={_damage} mod_dmg={_modified_damage} hp_before={_hp_before}");
obj_ncombat.combat_debugger.add(eCOMBAT_CATEGORY.DAMAGE, $"damage_vehicles veh[{veh_index}] ({_damage_data.unit_type}) DESTROYED: armour={_veh_armour} raw_dmg={_damage} mod_dmg={_modified_damage} hp_before={_hp_before}");

// Record loss
var existing_index = array_get_index(lost, veh_type[veh_index]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,16 @@ function scr_player_combat_weapon_stacks() {
}
}
}
if (is_struct(mobi_item) && mobi_item.has_tag("bike")) {
var _speed_force = unit.speed_force(mobi_item.has_tag("sf_ranged"));
Comment thread
EttyKitty marked this conversation as resolved.
var stack_index = find_stack_index(_speed_force.name, head_role, unit);
if (stack_index > -1) {
add_data_to_stack(stack_index, _speed_force, false, head_role, unit);
if (head_role) {
player_head_role_stack(stack_index, unit);
}
}
}

if (is_struct(mobi_item)) {
add_second_profiles_to_stack(mobi_item);
Expand Down
15 changes: 14 additions & 1 deletion scripts/scr_punit_combat_heplers/scr_punit_combat_heplers.gml
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ function pick_target_column(target_type, mode) {
_x2 += 10;
var _enemy2 = instance_nearest(_x2, y, obj_enunit);

if (has_target_type(_enemy2, target_type, mode)) {
if (has_target_type(_enemy2, target_type, mode) && check_column_obstruction(enemy.column_size, _enemy2.column_size)) {
return _enemy2;
}
}
Expand All @@ -323,3 +323,16 @@ function pick_target_column(target_type, mode) {
return undefined;
}
}

function check_column_obstruction(front_size, back_size) {
if (back_size < front_size) {
return true;
} else {
var _pass_chance = ((back_size / front_size) - 1) * 100;
if (irandom_range(1, 100) < min(_pass_chance, 80)) {
return true;
}
}

return false;
}
Loading
Loading