From ec1ab3fbcfcf9de58c3f14ff393dbcceffe47d05 Mon Sep 17 00:00:00 2001 From: savask Date: Tue, 17 Aug 2010 16:38:08 +0800 Subject: [PATCH] Fixed photons spawning, but it's still have some bugs. --- powder.c | 625 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 320 insertions(+), 305 deletions(-) diff --git a/powder.c b/powder.c index 9371e37b9..1e27abd07 100644 --- a/powder.c +++ b/powder.c @@ -2262,353 +2262,368 @@ killed: } if(t==PT_STKM) - { - //Tempirature handling - if(parts[i].temp<-30) - parts[i].life -= 0.2; - if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) - parts[i].temp += 1; + { + //Tempirature handling + if(parts[i].temp<-30) + parts[i].life -= 0.2; + if((parts[i].temp<36.6f) && (parts[i].temp>=-30)) + parts[i].temp += 1; - //Death - if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... - { - for(r=-2; r<=1; r++) - { - create_part(-1, x+r, y-2, player[2]); - create_part(-1, x+r+1, y+2, player[2]); - create_part(-1, x-2, y+r+1, player[2]); - create_part(-1, x+2, y+r, player[2]); - } - kill_part(i); //Kill him - goto killed; - } + //Death + if(parts[i].life<=0 || pv[y/CELL][x/CELL]>=4.5f) //If his HP is less that 0 or there is very big wind... + { + for(r=-2; r<=1; r++) + { + create_part(-1, x+r, y-2, player[2]); + create_part(-1, x+r+1, y+2, player[2]); + create_part(-1, x-2, y+r+1, player[2]); + create_part(-1, x+2, y+r, player[2]); + } + kill_part(i); //Kill him + goto killed; + } - //Verlet integration - pp = 2*player[3]-player[5]; - player[5] = player[3]; - player[3] = pp; - pp = 2*player[4]-player[6]; - player[6] = player[4]; - player[4] = pp; + //Verlet integration + pp = 2*player[3]-player[5]; + player[5] = player[3]; + player[3] = pp; + pp = 2*player[4]-player[6]; + player[6] = player[4]; + player[4] = pp; - pp = 2*player[7]-player[9]; - player[9] = player[7]; - player[7] = pp; - pp = 2*player[8]-player[10]+1; - player[10] = player[8]; - player[8] = pp; + pp = 2*player[7]-player[9]; + player[9] = player[7]; + player[7] = pp; + pp = 2*player[8]-player[10]+1; + player[10] = player[8]; + player[8] = pp; - pp = 2*player[11]-player[13]; - player[13] = player[11]; - player[11] = pp; - pp = 2*player[12]-player[14]; - player[14] = player[12]; - player[12] = pp; + pp = 2*player[11]-player[13]; + player[13] = player[11]; + player[11] = pp; + pp = 2*player[12]-player[14]; + player[14] = player[12]; + player[12] = pp; - pp = 2*player[15]-player[17]; - player[17] = player[15]; - player[15] = pp; - pp = 2*player[16]-player[18]+1; - player[18] = player[16]; - player[16] = pp; + pp = 2*player[15]-player[17]; + player[17] = player[15]; + player[15] = pp; + pp = 2*player[16]-player[18]+1; + player[18] = player[16]; + player[16] = pp; - //Go left - if (((int)(player[0])&0x01) == 0x01) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] += 3; - player[10] += 2; - player[5] += 2; - } + //Go left + if (((int)(player[0])&0x01) == 0x01) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] += 3; + player[10] += 2; + player[5] += 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 3; - player[18] += 2; - player[13] +=2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids - { - player[9] += 1; - player[10] += 1; - player[5] += 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 3; + player[18] += 2; + player[13] +=2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) //It should move another way in liquids + { + player[9] += 1; + player[10] += 1; + player[5] += 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] += 1; - player[18] += 1; - player[13] +=1; - } - } - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] += 1; + player[18] += 1; + player[13] +=1; + } + } + } - //Go right - if (((int)(player[0])&0x02) == 0x02) - { - if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID - && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 3; - player[10] += 2; - player[5] -= 2; - } + //Go right + if (((int)(player[0])&0x02) == 0x02) + { + if (pstates[pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF].state != ST_LIQUID + && (pmap[(int)(parts[i].y+10)][(int)(parts[i].x)]&0xFF) != PT_LNTG) + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 3; + player[10] += 2; + player[5] -= 2; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 3; - player[18] += 2; - player[13] -= 2; - } - } - else - { - if (pmap[(int)(player[8]-1)][(int)(player[7])]) - { - player[9] -= 1; - player[10] += 1; - player[5] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 3; + player[18] += 2; + player[13] -= 2; + } + } + else + { + if (pmap[(int)(player[8]-1)][(int)(player[7])]) + { + player[9] -= 1; + player[10] += 1; + player[5] -= 1; + } - if (pmap[(int)(player[16]-1)][(int)(player[15])]) - { - player[17] -= 1; - player[18] += 1; - player[13] -= 1; - } + if (pmap[(int)(player[16]-1)][(int)(player[15])]) + { + player[17] -= 1; + player[18] += 1; + player[13] -= 1; + } - } - } + } + } - //Charge detector wall if foot inside - if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) - set_emap((int)player[7]/CELL, (int)player[8]/CELL); - if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) - set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); + //Charge detector wall if foot inside + if(bmap[(int)(player[8]+0.5)/CELL][(int)(player[7]+0.5)/CELL]==6) + set_emap((int)player[7]/CELL, (int)player[8]/CELL); + if(bmap[(int)(player[16]+0.5)/CELL][(int)(player[15]+0.5)/CELL]==6) + set_emap((int)(player[15]+0.5)/CELL, (int)(player[16]+0.5)/CELL); - //Searching for particles near head - for(nx = -2; nx <= 2; nx++) - for(ny = 0; ny>=-2; ny--) - { - if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) - continue; - if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM - && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) - || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) - { - player[2] = pmap[ny+y][nx+x]&0xFF; //Current element - } - if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP - { - if(parts[i].life<=95) - parts[i].life += 5; - else - parts[i].life = 100; - kill_part(pmap[ny+y][nx+x]>>8); - } + //Searching for particles near head + for(nx = -2; nx <= 2; nx++) + for(ny = 0; ny>=-2; ny--) + { + if(!pmap[ny+y][nx+x] || (pmap[ny+y][nx+x]>>8)>=NPART) + continue; + if((pstates[pmap[ny+y][nx+x]&0xFF].state != ST_SOLID && (pmap[ny+y][nx+x]&0xFF)!=PT_STKM + && (pmap[ny+y][nx+x]&0xFF)!=PT_WHOL && (pmap[ny+y][nx+x]&0xFF)!=PT_BHOL) + || (pmap[ny+y][nx+x]&0xFF) == PT_LNTG) + { + player[2] = pmap[ny+y][nx+x]&0xFF; //Current element + } + if((pmap[ny+y][nx+x]&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP + { + if(parts[i].life<=95) + parts[i].life += 5; + else + parts[i].life = 100; + kill_part(pmap[ny+y][nx+x]>>8); + } - if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) - { - parts[i].life -= (102-parts[i].life)/2; - kill_part(pmap[ny+y][nx+x]>>8); - } - } + if((pmap[ny+y][nx+x]&0xFF) == PT_NEUT) + { + parts[i].life -= (102-parts[i].life)/2; + kill_part(pmap[ny+y][nx+x]>>8); + } + } - //Head position - nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); - ny = y - 3*(player[1] == 0); + //Head position + nx = x + 3*((((int)player[1])&0x02) == 0x02) - 3*((((int)player[1])&0x01) == 0x01); + ny = y - 3*(player[1] == 0); - //Spawn - if(((int)(player[0])&0x08) == 0x08) - { - ny -= 2*(rand()%2)+1; - r = pmap[ny][nx]; - if(!((r>>8)>=NPART)) - { - if(pstates[r&0xFF].state == ST_SOLID) - { - create_part(-1, nx, ny, PT_SPRK); - } - else - { - create_part(-1, nx, ny, player[2]); - r = pmap[ny][nx]; - if( ((r>>8) < NPART) && (r>>8)>=0 ) - parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); - } - } - } + //Spawn + if(((int)(player[0])&0x08) == 0x08) + { + ny -= 2*(rand()%2)+1; + r = pmap[ny][nx]; + if(!((r>>8)>=NPART)) + { + if(pstates[r&0xFF].state == ST_SOLID) + { + create_part(-1, nx, ny, PT_SPRK); + } + else + { + create_part(-1, nx, ny, player[2]); + r = pmap[ny][nx]; + if( ((r>>8) < NPART) && (r>>8)>=0 && player[2]!=PT_PHOT) + parts[r>>8].vx = parts[r>>8].vx + 5*((((int)player[1])&0x02) == 0x02) - 5*(((int)(player[1])&0x01) == 0x01); + if(((r>>8) < NPART) && (r>>8)>=0 && player[2] == PT_PHOT) + { + int random = abs(rand()%3-1)*3; + if (random==0) + { + parts[r>>8].life = 0; + parts[r>>8].type = PT_NONE; + } + else + { + parts[r>>8].vy = 0; + parts[r>>8].vx = (((((int)player[1])&0x02) == 0x02) - (((int)(player[1])&0x01) == 0x01))*random; + } + } - //Jump - if (((int)(player[0])&0x04) == 0x04) - { - if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) - { - parts[i].vy = -5; - player[10] += 1; - player[18] += 1; - } + } + } + } - } + //Jump + if (((int)(player[0])&0x04) == 0x04) + { + if (pmap[(int)(player[8]-0.5)][(int)(player[7])] || pmap[(int)(player[16]-0.5)][(int)(player[15])]) + { + parts[i].vy = -5; + player[10] += 1; + player[18] += 1; + } - //Simulation of joints - d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance - player[7] -= (player[3]-player[7])*d; - player[8] -= (player[4]-player[8])*d; - player[3] += (player[3]-player[7])*d; - player[4] += (player[4]-player[8])*d; + } - d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; - player[15] -= (player[11]-player[15])*d; - player[16] -= (player[12]-player[16])*d; - player[11] += (player[11]-player[15])*d; - player[12] += (player[12]-player[16])*d; + //Simulation of joints + d = 25/(pow((player[3]-player[7]), 2) + pow((player[4]-player[8]), 2)+25) - 0.5; //Fast distance + player[7] -= (player[3]-player[7])*d; + player[8] -= (player[4]-player[8])*d; + player[3] += (player[3]-player[7])*d; + player[4] += (player[4]-player[8])*d; - d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[3]-parts[i].x)*d; - parts[i].vy -= (player[4]-parts[i].y)*d; - player[3] += (player[3]-parts[i].x)*d; - player[4] += (player[4]-parts[i].y)*d; + d = 25/(pow((player[11]-player[15]), 2) + pow((player[12]-player[16]), 2)+25) - 0.5; + player[15] -= (player[11]-player[15])*d; + player[16] -= (player[12]-player[16])*d; + player[11] += (player[11]-player[15])*d; + player[12] += (player[12]-player[16])*d; - d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; - parts[i].vx -= (player[11]-parts[i].x)*d; - parts[i].vy -= (player[12]-parts[i].y)*d; - player[11] += (player[11]-parts[i].x)*d; - player[12] += (player[12]-parts[i].y)*d; + d = 36/(pow((player[3]-parts[i].x), 2) + pow((player[4]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[3]-parts[i].x)*d; + parts[i].vy -= (player[4]-parts[i].y)*d; + player[3] += (player[3]-parts[i].x)*d; + player[4] += (player[4]-parts[i].y)*d; - //Side collisions checking - for(nx = -3; nx <= 3; nx++) - { - if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) - player[15] -= nx; + d = 36/(pow((player[11]-parts[i].x), 2) + pow((player[12]-parts[i].y), 2)+36) - 0.5; + parts[i].vx -= (player[11]-parts[i].x)*d; + parts[i].vy -= (player[12]-parts[i].y)*d; + player[11] += (player[11]-parts[i].x)*d; + player[12] += (player[12]-parts[i].y)*d; - if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) - player[7] -= nx; - } + //Side collisions checking + for(nx = -3; nx <= 3; nx++) + { + if(pmap[(int)(player[16]-2)][(int)(player[15]+nx)]) + player[15] -= nx; - //Collision checks - for(ny = -2-(int)parts[i].vy; ny<=0; ny++) - { - r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) + if(pmap[(int)(player[8]-2)][(int)(player[7]+nx)]) + player[7] -= nx; + } - //For left leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks - { - if(parts[i].y<(player[8]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[8] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[9] = player[7]; - } + //Collision checks + for(ny = -2-(int)parts[i].vy; ny<=0; ny++) + { + r = pmap[(int)(player[8]+ny)][(int)(player[7]+0.5)]; //This is to make coding more pleasant :-) - r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; + //For left leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) //Liquid checks + { + if(parts[i].y<(player[8]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[8] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[9] = player[7]; + } - //For right leg - if (r && (r&0xFF)!=PT_STKM) - { - if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) - { - if(parts[i].y<(player[16]-10)) - parts[i].vy = 1; - else - parts[i].vy = 0; - if(abs(parts[i].vx)>1) - parts[i].vx *= 0.5; - } - else - { - player[16] += ny-1; - parts[i].vy -= 0.5*parts[i].vy; - } - player[17] = player[15]; - } + r = pmap[(int)(player[16]+ny)][(int)(player[15]+0.5)]; - //If it falls too fast - if (parts[i].vy>=30) - { - parts[i].y -= 10+ny; - parts[i].vy = -10; - } + //For right leg + if (r && (r&0xFF)!=PT_STKM) + { + if(pstates[r&0xFF].state == ST_LIQUID || pstates[r&0xFF].state == ST_GAS || (r&0xFF)==PT_LNTG) + { + if(parts[i].y<(player[16]-10)) + parts[i].vy = 1; + else + parts[i].vy = 0; + if(abs(parts[i].vx)>1) + parts[i].vx *= 0.5; + } + else + { + player[16] += ny-1; + parts[i].vy -= 0.5*parts[i].vy; + } + player[17] = player[15]; + } - } + //If it falls too fast + if (parts[i].vy>=30) + { + parts[i].y -= 10+ny; + parts[i].vy = -10; + } - //Keeping legs distance - if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) - { - player[7] += 0.2; - player[15] -= 0.2; - } + } - if (pow((player[3] - player[11]), 2)<16 && pow((player[4]-player[12]), 2)<1) - { - player[3] += 0.2; - player[11] -= 0.2; - } + //Keeping legs distance + if (pow((player[7] - player[15]), 2)<16 && pow((player[8]-player[16]), 2)<1) + { + player[7] += 0.2; + player[15] -= 0.2; + } - //If legs touch something - r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[16] -= 1; - } - } + //If legs touch something + r = pmap[(int)(player[8]+0.5)][(int)(player[7]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[16] -= 1; + } + } - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; - r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; - if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) - { - parts[i].life -= 2; - player[8] -= 1; - } - } + r = pmap[(int)(player[16]+0.5)][(int)(player[15]+0.5)]; + if((r&0xFF)==PT_SPRK && r && (r>>8)0 && (r>>8)>8].temp>=50 || parts[r>>8].temp<=-30) + { + parts[i].life -= 2; + player[8] -= 1; + } + } - if ((r&0xFF)==PT_PLUT) //If on plut - parts[i].life -= 1; + if ((r&0xFF)==PT_ACID) //If on acid + parts[i].life -= 5; - isplayer = 1; - } + if ((r&0xFF)==PT_PLUT) //If on plut + parts[i].life -= 1; + + isplayer = 1; + } if(t==PT_CLNE) {