Make stickman movement strength independent of gravity (#857)

This commit is contained in:
catsoften
2022-09-25 08:49:43 -04:00
committed by GitHub
parent 0f9b1a58b1
commit 5d66533f23

View File

@@ -164,27 +164,27 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
gvx += sim->gravx[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)]; gvx += sim->gravx[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)];
gvy += sim->gravy[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)]; gvy += sim->gravy[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)];
float rbx = gvx; float mvx = gvx;
float rby = gvy; float mvy = gvy;
bool rbLowGrav = false; bool rbLowGrav = false;
float tmp = fabsf(rbx) > fabsf(rby)?fabsf(rbx):fabsf(rby); float tmp = fabsf(mvx) > fabsf(mvy)?fabsf(mvx):fabsf(mvy);
if (tmp < 0.001f) if (tmp < 0.001f)
{ {
rbLowGrav = true; rbLowGrav = true;
rbx = -parts[i].vx; mvx = -parts[i].vx;
rby = -parts[i].vy; mvy = -parts[i].vy;
tmp = fabsf(rbx) > fabsf(rby)?fabsf(rbx):fabsf(rby); tmp = fabsf(mvx) > fabsf(mvy)?fabsf(mvx):fabsf(mvy);
} }
if (tmp < 0.001f) if (tmp < 0.001f)
{ {
rbx = 0; mvx = 0;
rby = 1.0f; mvy = 1.0f;
tmp = 1.0f; tmp = 1.0f;
} }
else else
tmp = 1.0f/sqrtf(rbx*rbx+rby*rby); tmp = 1.0f/sqrtf(mvx*mvx+mvy*mvy);
rbx *= tmp;// scale to a unit vector mvx *= tmp;// scale to a unit vector
rby *= tmp; mvy *= tmp;
if (rbLowGrav) if (rbLowGrav)
{ {
rocketBootsHeadEffectV = rocketBootsHeadEffect; rocketBootsHeadEffectV = rocketBootsHeadEffect;
@@ -249,10 +249,10 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
{ {
if (INBOND(playerp->legs[4], playerp->legs[5]) && !sim->eval_move(t, int(playerp->legs[4]), int(playerp->legs[5]), NULL)) if (INBOND(playerp->legs[4], playerp->legs[5]) && !sim->eval_move(t, int(playerp->legs[4]), int(playerp->legs[5]), NULL))
{ {
playerp->accs[2] = -3*gvy-3*gvx; playerp->accs[2] = -3*mvy-3*mvx;
playerp->accs[3] = 3*gvx-3*gvy; playerp->accs[3] = 3*mvx-3*mvy;
playerp->accs[0] = -gvy; playerp->accs[0] = -mvy;
playerp->accs[1] = gvx; playerp->accs[1] = mvx;
moved = true; moved = true;
} }
} }
@@ -260,21 +260,21 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
{ {
if (INBOND(playerp->legs[12], playerp->legs[13]) && !sim->eval_move(t, int(playerp->legs[12]), int(playerp->legs[13]), NULL)) if (INBOND(playerp->legs[12], playerp->legs[13]) && !sim->eval_move(t, int(playerp->legs[12]), int(playerp->legs[13]), NULL))
{ {
playerp->accs[6] = -3*gvy-3*gvx; playerp->accs[6] = -3*mvy-3*mvx;
playerp->accs[7] = 3*gvx-3*gvy; playerp->accs[7] = 3*mvx-3*mvy;
playerp->accs[0] = -gvy; playerp->accs[0] = -mvy;
playerp->accs[1] = gvx; playerp->accs[1] = mvx;
moved = true; moved = true;
} }
} }
if (!moved && playerp->rocketBoots) if (!moved && playerp->rocketBoots)
{ {
parts[i].vx -= rocketBootsHeadEffect*rby; parts[i].vx -= rocketBootsHeadEffect*mvy;
parts[i].vy += rocketBootsHeadEffect*rbx; parts[i].vy += rocketBootsHeadEffect*mvx;
playerp->accs[2] -= rocketBootsFeetEffect*rby; playerp->accs[2] -= rocketBootsFeetEffect*mvy;
playerp->accs[6] -= rocketBootsFeetEffect*rby; playerp->accs[6] -= rocketBootsFeetEffect*mvy;
playerp->accs[3] += rocketBootsFeetEffect*rbx; playerp->accs[3] += rocketBootsFeetEffect*mvx;
playerp->accs[7] += rocketBootsFeetEffect*rbx; playerp->accs[7] += rocketBootsFeetEffect*mvx;
for (int leg=0; leg<2; leg++) for (int leg=0; leg<2; leg++)
{ {
if (leg==1 && (((int)(playerp->comm)&0x02) == 0x02)) if (leg==1 && (((int)(playerp->comm)&0x02) == 0x02))
@@ -283,8 +283,8 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
int np = sim->create_part(-1, footX, footY, PT_PLSM); int np = sim->create_part(-1, footX, footY, PT_PLSM);
if (np>=0) if (np>=0)
{ {
parts[np].vx = parts[i].vx+rby*25; parts[np].vx = parts[i].vx+mvy*25;
parts[np].vy = parts[i].vy-rbx*25; parts[np].vy = parts[i].vy-mvx*25;
parts[np].life += 30; parts[np].life += 30;
} }
} }
@@ -299,10 +299,10 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
{ {
if (INBOND(playerp->legs[4], playerp->legs[5]) && !sim->eval_move(t, int(playerp->legs[4]), int(playerp->legs[5]), NULL)) if (INBOND(playerp->legs[4], playerp->legs[5]) && !sim->eval_move(t, int(playerp->legs[4]), int(playerp->legs[5]), NULL))
{ {
playerp->accs[2] = 3*gvy-3*gvx; playerp->accs[2] = 3*mvy-3*mvx;
playerp->accs[3] = -3*gvx-3*gvy; playerp->accs[3] = -3*mvx-3*mvy;
playerp->accs[0] = gvy; playerp->accs[0] = mvy;
playerp->accs[1] = -gvx; playerp->accs[1] = -mvx;
moved = true; moved = true;
} }
} }
@@ -310,21 +310,21 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
{ {
if (INBOND(playerp->legs[12], playerp->legs[13]) && !sim->eval_move(t, int(playerp->legs[12]), int(playerp->legs[13]), NULL)) if (INBOND(playerp->legs[12], playerp->legs[13]) && !sim->eval_move(t, int(playerp->legs[12]), int(playerp->legs[13]), NULL))
{ {
playerp->accs[6] = 3*gvy-3*gvx; playerp->accs[6] = 3*mvy-3*mvx;
playerp->accs[7] = -3*gvx-3*gvy; playerp->accs[7] = -3*mvx-3*mvy;
playerp->accs[0] = gvy; playerp->accs[0] = mvy;
playerp->accs[1] = -gvx; playerp->accs[1] = -mvx;
moved = true; moved = true;
} }
} }
if (!moved && playerp->rocketBoots) if (!moved && playerp->rocketBoots)
{ {
parts[i].vx += rocketBootsHeadEffect*rby; parts[i].vx += rocketBootsHeadEffect*mvy;
parts[i].vy -= rocketBootsHeadEffect*rbx; parts[i].vy -= rocketBootsHeadEffect*mvx;
playerp->accs[2] += rocketBootsFeetEffect*rby; playerp->accs[2] += rocketBootsFeetEffect*mvy;
playerp->accs[6] += rocketBootsFeetEffect*rby; playerp->accs[6] += rocketBootsFeetEffect*mvy;
playerp->accs[3] -= rocketBootsFeetEffect*rbx; playerp->accs[3] -= rocketBootsFeetEffect*mvx;
playerp->accs[7] -= rocketBootsFeetEffect*rbx; playerp->accs[7] -= rocketBootsFeetEffect*mvx;
for (int leg=0; leg<2; leg++) for (int leg=0; leg<2; leg++)
{ {
if (leg==0 && (((int)(playerp->comm)&0x01) == 0x01)) if (leg==0 && (((int)(playerp->comm)&0x01) == 0x01))
@@ -333,8 +333,8 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
int np = sim->create_part(-1, footX, footY, PT_PLSM); int np = sim->create_part(-1, footX, footY, PT_PLSM);
if (np>=0) if (np>=0)
{ {
parts[np].vx = parts[i].vx-rby*25; parts[np].vx = parts[i].vx-mvy*25;
parts[np].vy = parts[i].vy+rbx*25; parts[np].vy = parts[i].vy+mvx*25;
parts[np].life += 30; parts[np].life += 30;
} }
} }
@@ -356,20 +356,20 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
{ {
if (playerp->rocketBoots) if (playerp->rocketBoots)
{ {
parts[i].vx -= rocketBootsHeadEffectV*rbx; parts[i].vx -= rocketBootsHeadEffectV*mvx;
parts[i].vy -= rocketBootsHeadEffectV*rby; parts[i].vy -= rocketBootsHeadEffectV*mvy;
playerp->accs[2] -= rocketBootsFeetEffectV*rbx; playerp->accs[2] -= rocketBootsFeetEffectV*mvx;
playerp->accs[6] -= rocketBootsFeetEffectV*rbx; playerp->accs[6] -= rocketBootsFeetEffectV*mvx;
playerp->accs[3] -= rocketBootsFeetEffectV*rby; playerp->accs[3] -= rocketBootsFeetEffectV*mvy;
playerp->accs[7] -= rocketBootsFeetEffectV*rby; playerp->accs[7] -= rocketBootsFeetEffectV*mvy;
for (int leg=0; leg<2; leg++) for (int leg=0; leg<2; leg++)
{ {
int footX = int(playerp->legs[leg*8+4]), footY = int(playerp->legs[leg*8+5]); int footX = int(playerp->legs[leg*8+4]), footY = int(playerp->legs[leg*8+5]);
int np = sim->create_part(-1, footX, footY+1, PT_PLSM); int np = sim->create_part(-1, footX, footY+1, PT_PLSM);
if (np>=0) if (np>=0)
{ {
parts[np].vx = parts[i].vx+rbx*30; parts[np].vx = parts[i].vx+mvx*30;
parts[np].vy = parts[i].vy+rby*30; parts[np].vy = parts[i].vy+mvy*30;
parts[np].life += 10; parts[np].life += 10;
} }
} }
@@ -377,12 +377,12 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
else if ((INBOND(playerp->legs[4], playerp->legs[5]) && !sim->eval_move(t, int(playerp->legs[4]), int(playerp->legs[5]), NULL)) || else if ((INBOND(playerp->legs[4], playerp->legs[5]) && !sim->eval_move(t, int(playerp->legs[4]), int(playerp->legs[5]), NULL)) ||
(INBOND(playerp->legs[12], playerp->legs[13]) && !sim->eval_move(t, int(playerp->legs[12]), int(playerp->legs[13]), NULL))) (INBOND(playerp->legs[12], playerp->legs[13]) && !sim->eval_move(t, int(playerp->legs[12]), int(playerp->legs[13]), NULL)))
{ {
parts[i].vx -= 4*gvx; parts[i].vx -= 4*mvx;
parts[i].vy -= 4*gvy; parts[i].vy -= 4*mvy;
playerp->accs[2] -= gvx; playerp->accs[2] -= mvx;
playerp->accs[6] -= gvx; playerp->accs[6] -= mvx;
playerp->accs[3] -= gvy; playerp->accs[3] -= mvy;
playerp->accs[7] -= gvy; playerp->accs[7] -= mvy;
} }
} }
@@ -496,7 +496,7 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
int angle; int angle;
int power = 100; int power = 100;
if (gvx!=0 || gvy!=0) if (gvx!=0 || gvy!=0)
angle = int(atan2(gvx, gvy)*180.0f/M_PI); angle = int(atan2(mvx, mvy)*180.0f/M_PI);
else else
angle = RNG::Ref().between(0, 359); angle = RNG::Ref().between(0, 359);
if (((int)playerp->pcomm)&0x01) if (((int)playerp->pcomm)&0x01)
@@ -512,8 +512,8 @@ int Element_STKM_run_stickman(playerst *playerp, UPDATE_FUNC_ARGS)
} }
else if (!playerp->fan) else if (!playerp->fan)
{ {
parts[np].vx -= -gvy*(5*((((int)playerp->pcomm)&0x02) == 0x02) - 5*(((int)(playerp->pcomm)&0x01) == 0x01)); parts[np].vx -= -mvy*(5*((((int)playerp->pcomm)&0x02) == 0x02) - 5*(((int)(playerp->pcomm)&0x01) == 0x01));
parts[np].vy -= gvx*(5*((((int)playerp->pcomm)&0x02) == 0x02) - 5*(((int)(playerp->pcomm)&0x01) == 0x01)); parts[np].vy -= mvx*(5*((((int)playerp->pcomm)&0x02) == 0x02) - 5*(((int)(playerp->pcomm)&0x01) == 0x01));
parts[i].vx -= (sim->elements[(int)playerp->elem].Weight*parts[np].vx)/1000; parts[i].vx -= (sim->elements[(int)playerp->elem].Weight*parts[np].vx)/1000;
} }
playerp->frames = 0; playerp->frames = 0;