int run_stickman(playerst* playerp, UPDATE_FUNC_ARGS) { int r, rx, ry; int t = parts[i].type; float pp, d; float dt = 0.9;///(FPSB*FPSB); //Delta time in square float gvx, gvy; float gx, gy, dl, dr; if ((parts[i].ctype>0 && parts[i].ctype<PT_NUM && ptypes[parts[i].ctype].enabled && ptypes[parts[i].ctype].falldown>0) || parts[i].ctype==SPC_AIR || parts[i].ctype == PT_NEUT || parts[i].ctype == PT_PHOT || parts[i].ctype == PT_LIGH) playerp->elem = parts[i].ctype; playerp->frames++; //Temperature handling if (parts[i].temp<243) parts[i].life -= 1; if ((parts[i].temp<309.6f) && (parts[i].temp>=243)) parts[i].temp += 1; //Death if (parts[i].life<1 || (pv[y/CELL][x/CELL]>=4.5f && playerp->elem != SPC_AIR) ) //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, playerp->elem); create_part(-1, x+r+1, y+2, playerp->elem); create_part(-1, x-2, y+r+1, playerp->elem); create_part(-1, x+2, y+r, playerp->elem); } kill_part(i); //Kill him return 1; } //Follow gravity gvx = gvy = 0.0f; switch (gravityMode) { default: case 0: gvy = 1; break; case 1: gvy = gvx = 0.0f; break; case 2: { float gravd; gravd = 0.01f - hypotf((parts[i].x - XCNTR), (parts[i].y - YCNTR)); gvx = ((float)(parts[i].x - XCNTR) / gravd); gvy = ((float)(parts[i].y - YCNTR) / gravd); } } gvx += gravx[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)]; gvy += gravy[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)]; parts[i].vx -= gvx*dt; //Head up! parts[i].vy -= gvy*dt; //Verlet integration pp = 2*playerp->legs[0]-playerp->legs[2]+playerp->accs[0]*dt*dt; playerp->legs[2] = playerp->legs[0]; playerp->legs[0] = pp; pp = 2*playerp->legs[1]-playerp->legs[3]+playerp->accs[1]*dt*dt; playerp->legs[3] = playerp->legs[1]; playerp->legs[1] = pp; pp = 2*playerp->legs[4]-playerp->legs[6]+(playerp->accs[2]+gvx)*dt*dt; playerp->legs[6] = playerp->legs[4]; playerp->legs[4] = pp; pp = 2*playerp->legs[5]-playerp->legs[7]+(playerp->accs[3]+gvy)*dt*dt; playerp->legs[7] = playerp->legs[5]; playerp->legs[5] = pp; pp = 2*playerp->legs[8]-playerp->legs[10]+playerp->accs[4]*dt*dt; playerp->legs[10] = playerp->legs[8]; playerp->legs[8] = pp; pp = 2*playerp->legs[9]-playerp->legs[11]+playerp->accs[5]*dt*dt; playerp->legs[11] = playerp->legs[9]; playerp->legs[9] = pp; pp = 2*playerp->legs[12]-playerp->legs[14]+(playerp->accs[6]+gvx)*dt*dt; playerp->legs[14] = playerp->legs[12]; playerp->legs[12] = pp; pp = 2*playerp->legs[13]-playerp->legs[15]+(playerp->accs[7]+gvy)*dt*dt; playerp->legs[15] = playerp->legs[13]; playerp->legs[13] = pp; //Setting acceleration to 0 playerp->accs[0] = 0; playerp->accs[1] = 0; playerp->accs[2] = 0; playerp->accs[3] = 0; playerp->accs[4] = 0; playerp->accs[5] = 0; playerp->accs[6] = 0; playerp->accs[7] = 0; gx = (playerp->legs[4] + playerp->legs[12])/2 - gvy; gy = (playerp->legs[5] + playerp->legs[13])/2 + gvx; dl = pow(gx - playerp->legs[4], 2) + pow(gy - playerp->legs[5], 2); dr = pow(gx - playerp->legs[12], 2) + pow(gy - playerp->legs[13], 2); //Go left if (((int)(playerp->comm)&0x01) == 0x01) { if (dl>dr) { if (INBOND(playerp->legs[4], playerp->legs[5]) && !eval_move(t, playerp->legs[4], playerp->legs[5], NULL)) { playerp->accs[2] = -3*gvy-3*gvx; playerp->accs[3] = 3*gvx-3*gvy; playerp->accs[0] = -gvy; playerp->accs[1] = gvx; } } else { if (INBOND(playerp->legs[12], playerp->legs[13]) && !eval_move(t, playerp->legs[12], playerp->legs[13], NULL)) { playerp->accs[6] = -3*gvy-3*gvx; playerp->accs[7] = 3*gvx-3*gvy; playerp->accs[0] = -gvy; playerp->accs[1] = gvx; } } } //Go right if (((int)(playerp->comm)&0x02) == 0x02) { if (dl<dr) { if (INBOND(playerp->legs[4], playerp->legs[5]) && !eval_move(t, playerp->legs[4], playerp->legs[5], NULL)) { playerp->accs[2] = 3*gvy-3*gvx; playerp->accs[3] = -3*gvx-3*gvy; playerp->accs[0] = gvy; playerp->accs[1] = -gvx; } } else { if (INBOND(playerp->legs[12], playerp->legs[13]) && !eval_move(t, playerp->legs[12], playerp->legs[13], NULL)) { playerp->accs[6] = 3*gvy-3*gvx; playerp->accs[7] = -3*gvx-3*gvy; playerp->accs[0] = gvy; playerp->accs[1] = -gvx; } } } //Jump if (((int)(playerp->comm)&0x04) == 0x04 && ((INBOND(playerp->legs[4], playerp->legs[5]) && !eval_move(t, playerp->legs[4], playerp->legs[5], NULL)) || (INBOND(playerp->legs[12], playerp->legs[13]) && !eval_move(t, playerp->legs[12], playerp->legs[13], NULL)))) { parts[i].vy -= 4*gvy; playerp->accs[3] -= gvy; playerp->accs[7] -= gvy; } //Charge detector wall if foot inside if (bmap[(int)(playerp->legs[5]+0.5)/CELL][(int)(playerp->legs[4]+0.5)/CELL]==WL_DETECT) set_emap((int)playerp->legs[4]/CELL, (int)playerp->legs[5]/CELL); if (bmap[(int)(playerp->legs[13]+0.5)/CELL][(int)(playerp->legs[12]+0.5)/CELL]==WL_DETECT) set_emap((int)(playerp->legs[12]+0.5)/CELL, (int)(playerp->legs[13]+0.5)/CELL); //Searching for particles near head for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) r = photons[y+ry][x+rx]; if (!r && !bmap[(y+ry)/CELL][(x+rx)/CELL]) continue; if (ptypes[r&0xFF].falldown!=0 || ptypes[r&0xFF].state == ST_GAS || ptypes[r&0xFF].properties&TYPE_GAS || ptypes[r&0xFF].properties&TYPE_LIQUID || (r&0xFF) == PT_NEUT || (r&0xFF) == PT_PHOT) { playerp->elem = r&0xFF; //Current element } if ((r&0xFF)==PT_TESC || (r&0xFF)==PT_LIGH) playerp->elem = PT_LIGH; if ((r&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(r>>8); } if ((r&0xFF) == PT_NEUT) { if (parts[i].life<=100) parts[i].life -= (102-parts[i].life)/2; else parts[i].life *= 0.9f; kill_part(r>>8); } if (bmap[(ry+y)/CELL][(rx+x)/CELL]==WL_FAN) playerp->elem = SPC_AIR; if ((r&0xFF)==PT_PRTI) STKM_interact(playerp, i, rx, ry); if (!parts[i].type)//STKM_interact may kill STKM return 1; }
int update_FIGH(UPDATE_FUNC_ARGS) { playerst* figh = &fighters[(unsigned char)parts[i].tmp]; unsigned int tarx, tary; parts[i].tmp2 = 0; //0 - stay in place, 1 - seek a stick man //Set target coords if (player.spwn && player2.spwn) { if ((pow(player.legs[2]-x, 2) + pow(player.legs[3]-y, 2))<= (pow(player2.legs[2]-x, 2) + pow(player2.legs[3]-y, 2))) { tarx = (unsigned int)player.legs[2]; tary = (unsigned int)player.legs[3]; } else { tarx = (unsigned int)player2.legs[2]; tary = (unsigned int)player2.legs[3]; } parts[i].tmp2 = 1; } else { if (player.spwn) { tarx = (unsigned int)player.legs[2]; tary = (unsigned int)player.legs[3]; parts[i].tmp2 = 1; } if (player2.spwn) { tarx = (unsigned int)player2.legs[2]; tary = (unsigned int)player2.legs[3]; parts[i].tmp2 = 1; } } switch (parts[i].tmp2) { case 1: if ((pow(tarx-x, 2) + pow(tary-y, 2))<600) { if (figh->elem == PT_LIGH || figh->elem == PT_NEUT || ptypes[figh->elem].properties&(PROP_DEADLY|PROP_RADIOACTIVE) || ptypes[figh->elem].heat>=323 || ptypes[figh->elem].heat<=243) figh->comm = (int)figh->comm | 0x08; } else if (tarx<x) { if(!(eval_move(PT_FIGH, figh->legs[4]-10, figh->legs[5]+6, NULL) && eval_move(PT_FIGH, figh->legs[4]-10, figh->legs[5]+3, NULL))) figh->comm = 0x01; else figh->comm = 0x02; if (!eval_move(PT_FIGH, figh->legs[4]-4, figh->legs[5]-1, NULL) || !eval_move(PT_FIGH, figh->legs[12]-4, figh->legs[13]-1, NULL) || eval_move(PT_FIGH, 2*figh->legs[4]-figh->legs[6], figh->legs[5]+5, NULL)) figh->comm = (int)figh->comm | 0x04; } else { if (!(eval_move(PT_FIGH, figh->legs[12]+10, figh->legs[13]+6, NULL) && eval_move(PT_FIGH, figh->legs[12]+10, figh->legs[13]+3, NULL))) figh->comm = 0x02; else figh->comm = 0x01; if (!eval_move(PT_FIGH, figh->legs[4]+4, figh->legs[5]-1, NULL) || !eval_move(PT_FIGH, figh->legs[4]+4, figh->legs[5]-1, NULL) || eval_move(PT_FIGH, 2*figh->legs[12]-figh->legs[14], figh->legs[13]+5, NULL)) figh->comm = (int)figh->comm | 0x04; } break; default: figh->comm = 0; break; } figh->pcomm = figh->comm; run_stickman(figh, UPDATE_FUNC_SUBCALL_ARGS); return 0; }