Kill stickman/figh immediately if health goes below zero, fixes #929

This commit is contained in:
jacob1 2023-08-07 21:38:59 -04:00
parent 2c56adde5a
commit 8855a26667
No known key found for this signature in database
GPG Key ID: 4E58A32D510E1995

View File

@ -103,6 +103,20 @@ constexpr bool INBOND(int x, int y)
return x >= 0 && y >= 0 && x < XRES && y < YRES; return x >= 0 && y >= 0 && x < XRES && y < YRES;
} }
void die(Simulation *sim, playerst *playerp, int i)
{
int x = (int)(sim->parts[i].x + 0.5f);
int y = (int)(sim->parts[i].y + 0.5f);
for (int r = -2; r <= 1; r++)
{
sim->create_part(-1, x + r, y - 2, playerp->elem);
sim->create_part(-1, x + r + 1, y + 2, playerp->elem);
sim->create_part(-1, x - 2, y + r + 1, playerp->elem);
sim->create_part(-1, x + 2, y + r, playerp->elem);
}
sim->kill_part(i); //Kill him
}
int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS) int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
{ {
int r, rx, ry; int r, rx, ry;
@ -129,14 +143,7 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
//Death //Death
if (parts[i].life<1 || (sim->pv[y/CELL][x/CELL]>=4.5f && !playerp->fan) ) //If his HP is less than 0 or there is very big wind... if (parts[i].life<1 || (sim->pv[y/CELL][x/CELL]>=4.5f && !playerp->fan) ) //If his HP is less than 0 or there is very big wind...
{ {
for (r=-2; r<=1; r++) die(sim, playerp, i);
{
sim->create_part(-1, x+r, y-2, playerp->elem);
sim->create_part(-1, x+r+1, y+2, playerp->elem);
sim->create_part(-1, x-2, y+r+1, playerp->elem);
sim->create_part(-1, x+2, y+r, playerp->elem);
}
sim->kill_part(i); //Kill him
return 1; return 1;
} }
@ -631,14 +638,15 @@ void Element_STKM_interact(Simulation *sim, playerst *playerp, int i, int x, int
r = sim->pmap[y][x]; r = sim->pmap[y][x];
if (r) if (r)
{ {
int damage = 0;
if (TYP(r)==PT_SPRK && playerp->elem!=PT_LIGH) //If on charge if (TYP(r)==PT_SPRK && playerp->elem!=PT_LIGH) //If on charge
{ {
sim->parts[i].life -= sim->rng.between(32, 51); damage += sim->rng.between(32, 51);
} }
if (sim->elements[TYP(r)].HeatConduct && (TYP(r)!=PT_HSWC||sim->parts[ID(r)].life==10) && ((playerp->elem!=PT_LIGH && sim->parts[ID(r)].temp>=323) || sim->parts[ID(r)].temp<=243) && (!playerp->rocketBoots || TYP(r)!=PT_PLSM)) if (sim->elements[TYP(r)].HeatConduct && (TYP(r)!=PT_HSWC||sim->parts[ID(r)].life==10) && ((playerp->elem!=PT_LIGH && sim->parts[ID(r)].temp>=323) || sim->parts[ID(r)].temp<=243) && (!playerp->rocketBoots || TYP(r)!=PT_PLSM))
{ {
sim->parts[i].life -= 2; damage += 2;
playerp->accs[3] -= 1; playerp->accs[3] -= 1;
} }
@ -646,15 +654,25 @@ void Element_STKM_interact(Simulation *sim, playerst *playerp, int i, int x, int
switch (TYP(r)) switch (TYP(r))
{ {
case PT_ACID: case PT_ACID:
sim->parts[i].life -= 5; damage += 5;
break; break;
default: default:
sim->parts[i].life -= 1; damage++;
break; break;
} }
if (sim->elements[TYP(r)].Properties&PROP_RADIOACTIVE) if (sim->elements[TYP(r)].Properties&PROP_RADIOACTIVE)
sim->parts[i].life -= 1; damage++;
if (damage)
{
if (damage > sim->parts[i].life)
{
die(sim, playerp, i);
return;
}
sim->parts[i].life -= damage;
}
if (TYP(r)==PT_PRTI && sim->parts[i].type) if (TYP(r)==PT_PRTI && sim->parts[i].type)
{ {