mirror of
https://github.com/alexbatalov/fallout1-ce.git
synced 2024-10-06 06:39:51 +00:00
parent
8ceabd6ca4
commit
c1ad84b3b9
@ -2948,7 +2948,7 @@ static int compute_attack(Attack* attack)
|
|||||||
void compute_explosion_on_extras(Attack* attack, int a2, bool isGrenade, int a4)
|
void compute_explosion_on_extras(Attack* attack, int a2, bool isGrenade, int a4)
|
||||||
{
|
{
|
||||||
// 0x56BD58
|
// 0x56BD58
|
||||||
Attack temp_ctd;
|
static Attack temp_ctd;
|
||||||
|
|
||||||
Object* attacker;
|
Object* attacker;
|
||||||
|
|
||||||
@ -2962,58 +2962,53 @@ void compute_explosion_on_extras(Attack* attack, int a2, bool isGrenade, int a4)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int tile;
|
int origin_tile;
|
||||||
if (attacker != NULL) {
|
if (attacker != NULL) {
|
||||||
tile = attacker->tile;
|
origin_tile = attacker->tile;
|
||||||
} else {
|
} else {
|
||||||
tile = attack->tile;
|
origin_tile = attack->tile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tile == -1) {
|
int step;
|
||||||
debug_printf("\nError: compute_explosion_on_extras: Called with bad target/tileNum");
|
int radius = 0;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: The math in this loop is rather complex and hard to understand.
|
|
||||||
int v20;
|
|
||||||
int v22 = 0;
|
|
||||||
int rotation = 0;
|
int rotation = 0;
|
||||||
int v5 = -1;
|
int current_tile = -1;
|
||||||
int v19 = tile;
|
int current_center_tile = origin_tile;
|
||||||
while (attack->extrasLength < 6) {
|
while (attack->extrasLength < 6) {
|
||||||
if (v22 != 0 && (v5 == -1 || (v5 = tile_num_in_direction(v5, rotation, 1)) != v19)) {
|
if (radius != 0 && (current_tile = tile_num_in_direction(current_tile, rotation, 1)) != current_center_tile) {
|
||||||
v20++;
|
step++;
|
||||||
if (v20 % v22 == 0) {
|
if (step % radius == 0) {
|
||||||
rotation += 1;
|
rotation += 1;
|
||||||
if (rotation == ROTATION_COUNT) {
|
if (rotation == ROTATION_COUNT) {
|
||||||
rotation = ROTATION_NE;
|
rotation = ROTATION_NE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
v22++;
|
radius++;
|
||||||
// if (isGrenade && item_w_grenade_dmg_radius(attack->weapon) < v22) {
|
|
||||||
// v5 = -1;
|
|
||||||
// } else if (isGrenade || item_w_rocket_dmg_radius(attack->weapon) >= v22) {
|
|
||||||
// v5 = tile_num_in_direction(v19, ROTATION_NE, 1);
|
|
||||||
// } else {
|
|
||||||
// v5 = -1;
|
|
||||||
// }
|
|
||||||
|
|
||||||
v19 = v5;
|
if (isGrenade && radius > 2) {
|
||||||
rotation = ROTATION_SE;
|
current_tile = -1;
|
||||||
v20 = 0;
|
} else if (!isGrenade && radius > 3) {
|
||||||
|
current_tile = -1;
|
||||||
|
} else {
|
||||||
|
current_tile = tile_num_in_direction(current_center_tile, ROTATION_NE, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v5 == -1) {
|
current_center_tile = current_tile;
|
||||||
|
rotation = ROTATION_SE;
|
||||||
|
step = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_tile == -1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object* obstacle = obj_blocking_at(attacker, v5, attack->attacker->elevation);
|
Object* obstacle = obj_blocking_at(attacker, current_tile, attack->attacker->elevation);
|
||||||
if (obstacle != NULL
|
if (obstacle != NULL
|
||||||
&& FID_TYPE(obstacle->fid) == OBJ_TYPE_CRITTER
|
&& FID_TYPE(obstacle->fid) == OBJ_TYPE_CRITTER
|
||||||
&& (obstacle->data.critter.combat.results & DAM_DEAD) == 0
|
&& (obstacle->data.critter.combat.results & DAM_DEAD) == 0
|
||||||
&& (obstacle->flags & OBJECT_SHOOT_THRU) == 0
|
&& (obstacle->flags & OBJECT_SHOOT_THRU) == 0
|
||||||
&& !combat_is_shot_blocked(obstacle, obstacle->tile, tile, NULL, NULL)) {
|
&& !combat_is_shot_blocked(obstacle, obstacle->tile, origin_tile, NULL, NULL)) {
|
||||||
if (obstacle == attack->attacker) {
|
if (obstacle == attack->attacker) {
|
||||||
attack->attackerFlags &= ~DAM_HIT;
|
attack->attackerFlags &= ~DAM_HIT;
|
||||||
compute_damage(attack, 1, 2);
|
compute_damage(attack, 1, 2);
|
||||||
|
Loading…
Reference in New Issue
Block a user