Stickman go through portals

This commit is contained in:
jacksonmj 2011-08-20 07:14:38 +08:00 committed by Simon Robertshaw
parent 7d283335d4
commit a96afc863e
5 changed files with 89 additions and 126 deletions

View File

@ -322,6 +322,8 @@ int update_MISC(UPDATE_FUNC_ARGS);
int update_legacy_PYRO(UPDATE_FUNC_ARGS);
int update_legacy_all(UPDATE_FUNC_ARGS);
int run_stickman(float* playerp, UPDATE_FUNC_ARGS);
void STKM_init_legs(float* playerp, int i);
void STKM_interact(float* playerp, int i, int x, int y);
struct particle

View File

@ -49,6 +49,10 @@ int update_PRTO(UPDATE_FUNC_ARGS) {
}
else if (portalp[parts[i].tmp][randomness-1][nnx].type)
{
if (portalp[parts[i].tmp][randomness-1][nnx].type==PT_STKM)
player[27] = 0;
if (portalp[parts[i].tmp][randomness-1][nnx].type==PT_STKM2)
player2[27] = 0;
np = create_part(-1,x+rx,y+ry,portalp[parts[i].tmp][randomness-1][nnx].type);
if (np<0) continue;
parts[np] = portalp[parts[i].tmp][randomness-1][nnx];

View File

@ -215,6 +215,10 @@ int run_stickman(float* playerp, UPDATE_FUNC_ARGS) {
}
if (bmap[(ry+y)/CELL][(rx+x)/CELL]==WL_FAN)
playerp[2] = SPC_AIR;
if ((r&0xFF)==PT_PRTI)
STKM_interact(playerp, i, rx, ry);
if (!parts[i].type)//STKM_interact may kill STKM
return 1;
}
//Head position
@ -352,48 +356,82 @@ int run_stickman(float* playerp, UPDATE_FUNC_ARGS) {
}
//If legs touch something
r = pmap[(int)(playerp[8]+0.5)][(int)(playerp[7]+0.5)];
if ((r&0xFF)==PT_SPRK && r && (r>>8)<NPART) //If on charge
{
parts[i].life -= (int)(rand()/1000)+38;
}
if (r>0 && (r>>8)<NPART)
{
if (parts[r>>8].temp>=323 || parts[r>>8].temp<=243) //If hot or cold
{
parts[i].life -= 2;
playerp[26] -= 1;
}
}
if ((r&0xFF)==PT_ACID) //If on acid
parts[i].life -= 5;
if ((r&0xFF)==PT_PLUT) //If on plut
parts[i].life -= 1;
r = pmap[(int)(playerp[16]+0.5)][(int)(playerp[15]+0.5)];
if ((r&0xFF)==PT_SPRK && r && (r>>8)<NPART) //If on charge
{
parts[i].life -= (int)(rand()/1000)+38;
}
if (r>0 && (r>>8)<NPART) //If hot or cold
{
if (parts[r>>8].temp>=323 || parts[r>>8].temp<=243)
{
parts[i].life -= 2;
playerp[22] -= 1;
}
}
if ((r&0xFF)==PT_ACID) //If on acid
parts[i].life -= 5;
if ((r&0xFF)==PT_PLUT) //If on plut
parts[i].life -= 1;
STKM_interact(playerp, i, (int)(playerp[7]+0.5), (int)(playerp[8]+0.5));
STKM_interact(playerp, i, (int)(playerp[15]+0.5), (int)(playerp[16]+0.5));
if (!parts[i].type)
return 1;
parts[i].ctype = playerp[2];
return 0;
}
void STKM_interact(float* playerp, int i, int x, int y)
{
int r;
if (x<0 || y<0 || x>=XRES || y>=YRES || !parts[i].type)
return;
r = pmap[y][x];
if (r && (r>>8)<NPART)
{
if ((r&0xFF)==PT_SPRK && r && (r>>8)<NPART) //If on charge
{
parts[i].life -= (int)(rand()*20/RAND_MAX)+32;
}
if (ptypes[r&0xFF].hconduct && (parts[r>>8].temp>=323 || parts[r>>8].temp<=243))
{
parts[i].life -= 2;
playerp[22] -= 1;
}
if ((r&0xFF)==PT_ACID) //If on acid
parts[i].life -= 5;
if ((r&0xFF)==PT_PLUT) //If on plut
parts[i].life -= 1;
if ((r&0xFF)==PT_PRTI && parts[i].type)
{
int nnx, count;
parts[r>>8].tmp = (int)((parts[r>>8].temp-73.15f)/100+1);
if (parts[r>>8].tmp>=CHANNELS) parts[r>>8].tmp = CHANNELS-1;
else if (parts[r>>8].tmp<0) parts[r>>8].tmp = 0;
for (count=1; count<=8; count++)
for (nnx=0; nnx<80; nnx++)
if (!portalp[parts[r>>8].tmp][count-1][nnx].type)
{
portalp[parts[r>>8].tmp][count-1][nnx] = parts[i];
kill_part(i);
playerp[27] = 1;//stop SPWN creating a new STKM while he is in portal
}
}
}
}
void STKM_init_legs(float* playerp, int i)
{
int x, y;
x = (int)(parts[i].x+0.5f);
y = (int)(parts[i].y+0.5f);
player[3] = x-1;
player[4] = y+6;
player[5] = x-1;
player[6] = y+6;
player[7] = x-3;
player[8] = y+12;
player[9] = x-3;
player[10] = y+12;
player[11] = x+1;
player[12] = y+6;
player[13] = x+1;
player[14] = y+6;
player[15] = x+3;
player[16] = y+12;
player[17] = x+3;
player[18] = y+12;
}

View File

@ -980,54 +980,13 @@ int parse_save(void *save, int size, int replace, int x0, int y0, unsigned char
else if (parts[i-1].type == PT_STKM)
{
//player[2] = PT_DUST;
player[3] = parts[i-1].x-1; //Setti-1ng legs posi-1ti-1ons
player[4] = parts[i-1].y+6;
player[5] = parts[i-1].x-1;
player[6] = parts[i-1].y+6;
player[7] = parts[i-1].x-3;
player[8] = parts[i-1].y+12;
player[9] = parts[i-1].x-3;
player[10] = parts[i-1].y+12;
player[11] = parts[i-1].x+1;
player[12] = parts[i-1].y+6;
player[13] = parts[i-1].x+1;
player[14] = parts[i-1].y+6;
player[15] = parts[i-1].x+3;
player[16] = parts[i-1].y+12;
player[17] = parts[i-1].x+3;
player[18] = parts[i-1].y+12;
STKM_init_legs(player, i-1);
player[27] = 1;
}
else if (parts[i-1].type == PT_STKM2)
{
//player2[2] = PT_DUST;
player2[3] = parts[i-1].x-1; //Setti-1ng legs posi-1ti-1ons
player2[4] = parts[i-1].y+6;
player2[5] = parts[i-1].x-1;
player2[6] = parts[i-1].y+6;
player2[7] = parts[i-1].x-3;
player2[8] = parts[i-1].y+12;
player2[9] = parts[i-1].x-3;
player2[10] = parts[i-1].y+12;
player2[11] = parts[i-1].x+1;
player2[12] = parts[i-1].y+6;
player2[13] = parts[i-1].x+1;
player2[14] = parts[i-1].y+6;
player2[15] = parts[i-1].x+3;
player2[16] = parts[i-1].y+12;
player2[17] = parts[i-1].x+3;
player2[18] = parts[i-1].y+12;
STKM_init_legs(player2, i-1);
player2[27] = 1;
}

View File

@ -930,27 +930,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
parts[i].life = 100;
parts[i].ctype = 0;
parts[i].temp = ptypes[t].heat;
player[3] = x-1; //Setting legs positions
player[4] = y+6;
player[5] = x-1;
player[6] = y+6;
player[7] = x-3;
player[8] = y+12;
player[9] = x-3;
player[10] = y+12;
player[11] = x+1;
player[12] = y+6;
player[13] = x+1;
player[14] = y+6;
player[15] = x+3;
player[16] = y+12;
player[17] = x+3;
player[18] = y+12;
STKM_init_legs(player, i);
player[27] = 1;
}
else
@ -972,27 +952,7 @@ inline int create_part(int p, int x, int y, int tv)//the function for creating a
parts[i].life = 100;
parts[i].ctype = 0;
parts[i].temp = ptypes[t].heat;
player2[3] = x-1; //Setting legs positions
player2[4] = y+6;
player2[5] = x-1;
player2[6] = y+6;
player2[7] = x-3;
player2[8] = y+12;
player2[9] = x-3;
player2[10] = y+12;
player2[11] = x+1;
player2[12] = y+6;
player2[13] = x+1;
player2[14] = y+6;
player2[15] = x+3;
player2[16] = y+12;
player2[17] = x+3;
player2[18] = y+12;
STKM_init_legs(player2, i);
player2[27] = 1;
}
else